public class exer4 {
public static void main(String[] args) {
exer4 text = new exer4();
text.first();
}
public void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v,i);
System.out.println(v.i);
}
public void second(Value v, int i){
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i +" " + i);
}
class Value{
int i = 15;
}
}
输出结果为上图
顺序过程为从main方法中进入,建立text对象,对象调用first方法,进入first方法
堆中建立局部变量i i= 5,建立v的局部变量:复制该对象的地址值0x5566,将属性中的i改为25
进入second方法,创建两个形参局部变量v,i
将i的值改成0,之后将v.i的值改为20
新建局部变量val 将对象的地址赋给val
修改变量v的值为val的地址值
输出v.i为15,i为0
second方法结束后val i v这三个局部变量弹出栈,此时代码回到first方法中输出v.i。v的地址为0x5566中的地址i为20