Java对象存储/Static用法及原理/java参数传递机制

2,154 阅读3分钟

static :

static修饰的成员表示它属于类本身,不属于该类的单个实例(静态变量/静态方法)

对象存储

对于如下代码:

 1class Fruit{
2    public int weight;
3    public Fruit(int w) {
4        weight=w;
5    }
6
7}
8public class HelloWorld {
9    public static void main(String[] args) {
10        Fruit fruit=new Fruit(10);
11    }
12}
fruit对象在内存中存储在堆区,fruit实际上是一个引用变量,只存储了一个地址。
存储如下:

若再添加语句

    Fruit fruit2;
    fruit2=fruit1;

则存储图变为

this指针

作用:让类中的一个方法,访问该类里的另一个方法或成员变量。

  • 对于static修饰的方法,可以不使用this直接调用
  • 在static修饰的方法中,不可使用this,因为this无法指向合适的对象
  • static修饰的方法中不能访问不适用static修饰的成员变量
  • 无static修饰的方法可以调用有static修饰的方法
  • java编程时不要使用对象调用static方法和属性(替换成类调用static方法和属性)
  • 在static方法中不可直接调用普通方法,只能通过创建对象,然后访问对象的普通方法

JAVA 方法

java参数传递

值传递(参数都存在栈区)

  • 类似于西游记中孙悟空,可以变身形成一个h假孙悟空,假孙悟空拥有和真孙悟空相同的能力。但不管假孙悟空遇到被砍头等变化,真孙悟空也不会变化。
  • 传入的是实际参数值的复制品,不管方法中对这个值进行怎样的操作,实际的参数值都不会发生改变。

引用传递(举例说明)

如下代码:

 1class S{
2    public int a;
3    public int b;
4    public S(int aa,int bb{
5        a=aa;
6        b=bb;
7    }
8}
9public class HelloWorld {
10    public static void swap(S s{
11        int tmp=s.a;
12        s.a=s.b;
13    s.b=tmp;
14    }
15    public static void main(String[] args{
16        S s=new S(13);
17        System.out.println("交换前:a="+s.a+",b="+s.b);
18        swap(s);
19        System.out.println("交换后:a="+s.a+",b="+s.b);
20    }
21}

执行结果:

1交换前:a=1,b=3
2交换后:a=3,b=1
Main方法创建s对象后(16行执行完毕),存储示意图如下:

执行18行后,创建方法执行栈区swap栈,存储示意图如下: