写出程序的执行结果()
class Value{
int i = 15;
}
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.print(v.i + " " + i);
}
}
A.15 0 20
B.15 0 15
C.20 0 20
D.0 15 20
答案: A.15 0 20
以下是答案解析
第一步:
会先执行main方法,将main方法入栈
第二步:因为main调用了frist()方法,开始执行frist()方法,frist()方法入栈,创建了Value的对象,在堆内存中会开辟以一个对象的内存,地址为假设为0x11,v.i的值为15
第三步:执行frist()方法中v.i = 25。堆中v.i = 15;变为v.i = 25;
第四步:执行second(v,i)语句,second() 入栈,内存情况如下图,执行second()方法中v.i = 20。堆中v.i = 25;变为v.i = 20;
第五步:创建了Value的对象,在堆内存中会开辟以一个新的对象的内存,地址为假设为0x22,v.i的值为15, 执行v = val, v=ox11 变为v=ox22,并指向新的new对象地址,之后执行System.out.println(v.i+ " " + i),此时v.i = 15, i = 0,所以控制台输出15 0.
第五步:second()出栈。执行frist()方法的System.out.println(v.i).此时v.i = 20.控制台输出20.
最后答案为: A.15 0 20