变量的经典
大家知道,成员变量存在于堆内存,局部变量存在于栈中。
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