变量的经典

大家知道,成员变量存在于堆内存,局部变量存在于栈中。

public class Test {
    int a;
    int b;
    public void f(){
        a = 0;
        b = 0;
        int[] c = {0};
        g(b,c);
        System.out.println(a + " " + b + " " + c[0]);
    }
    public void g(int b, int[] c){
        a = 1;
        b = 1;
        c[0] = 1;
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.f();
    }
}

代码分析:

当执行到:

1.t.f()方法的时候,f()方法被调用

2.a = 0; b= 0;c[0] = 0;

3.调用g(b,c)方法,然后传入2个局部变量,b和c

 g的方法中,由于a和b是成员属性,存储在堆内存中,

  此时的将a=1,c[0]=1(主要是数组中存储的是数组的引用,即是地址值如:0x0012)

  而根据就近原则来说,b = 1,赋值给局部变量,局部变量随着方法的执行完成,弹栈,

  局部变量随着方法的弹栈而消失,所以成员变量b的值仍然是0;

最后的结果为: a= 1  b = 0 ; c[0] = 1

原文地址:https://www.cnblogs.com/donghaibin/p/9169297.html