class Value{
public int i=15;
}
public class Test{
public static void main(String argv[]){
Test t=new Test( );
t.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);
}
}
程序运行结果:15 0 20
程序首先执行main方法中的程序。
这里为了方便只画栈中Main方法的内存情况。
之后,执行t.first()方法,t.first()方法入栈,设Value v = new Value(); 在堆中创建的地址位ox99,如下图所示。
执行frist()方法中v.i = 25。堆中v.i = 15;变为v.i = 25;
执行second(v,i)语句,second() 入栈,内存情况如下图。
执行i = 0,v.i = 20;栈中second中的i变为i=0,堆中v.i变为v.i = 20.
执行Value v = new Value();在堆中创建一个新的对象地址。设为ox88;
执行v = val, v=ox99 变为v=ox88,并指向新的new对象地址。之后执行System.out.println(v.i+ " " + i),此时v.i = 15, i = 0,所以控制台输出15 0.
second()出栈。内存情况变为下图。执行System.out.println(v.i).此时v.i = 20.控制台输出20.
所以,最后程序执行结果为15 0 20.