SCJP中的一道题

时间:2022-07-29 17:48:12
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);
}
}
A.15 0 20
B.15 0 15
C.20 0 20
D.0 15 20

答案是A,有谁知道解题步骤吗

9 个解决方案

#1


如果你了解函数传参,就明白为什么答案是15 0 20, 我的博客中对java传参做了总结,你可以看看:

http://blog.csdn.net/ostrichmyself/archive/2009/10/03/4630976.aspx

#2


这个题目考的就是PUBLIC变量,可以任意的修改,还有就是局部和实例变量问题!

首先在FIRST方法里面,SECOND方法之前,内存里面存在一个方法局部变量,和一个VALUE对象的实例变量,注意这两个变量名字相同而已。别的没有任何联系!
VALUE对象的值被修改成了20,而后V引用又指向了一个新生成的VALUE对象!注意这里实际上内存里面有两个VALUE对象了!所以SENCOND打印出来的V.I是刚生成的,值就是15.前面的是20.中间的0没什么好说的!

#3


代码的执行顺序是
Test t = new Test();
t.first();调用方法first()
int i = 5; 
Value v = new Value(); 
v.i = 25; 
second(v, i); 调用方法second(),此时i=5,v.i=25
Value val = new Value();
i = 0; 
v.i = 20; 此时i=0,v.i=20
Value val = new Value(); 
v = val; 此处改变了引用,此时i=0,v.i=15而firsi()中的v.i仍然等于20
System.out.println(v.i + " " + i); 此时i=0,v.i=15
System.out.println(v.i); 此句在first()中,此处v.i=20

楼主看看这个《献给Java初学者》
http://blog.csdn.net/KingWolfOfSky/archive/2009/08/13/4444231.aspx

#4


画下内存应该就明白了

#5


引用的问题  我感觉考的还是参数传进函数中引用内存

#6


值传递和引用传递的问题。JAVA都是值传递。

#7


解题步骤内存分析:

首先执行方法first中前3句:
int i = 5;
Value v = new Value();
v.i = 25;
执行后的内存图:
SCJP中的一道题

然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
SCJP中的一道题

紧接着:
v = val;
形参v现在和val指向相同的对象
SCJP中的一道题
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0

然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
SCJP中的一道题
执行System.out.println(v.i);
打印结果为:
20

#8


楼主可不可以给点分意思意思?谢谢了~

#9


该回复于2009-10-14 12:41:39被版主删除

#1


如果你了解函数传参,就明白为什么答案是15 0 20, 我的博客中对java传参做了总结,你可以看看:

http://blog.csdn.net/ostrichmyself/archive/2009/10/03/4630976.aspx

#2


这个题目考的就是PUBLIC变量,可以任意的修改,还有就是局部和实例变量问题!

首先在FIRST方法里面,SECOND方法之前,内存里面存在一个方法局部变量,和一个VALUE对象的实例变量,注意这两个变量名字相同而已。别的没有任何联系!
VALUE对象的值被修改成了20,而后V引用又指向了一个新生成的VALUE对象!注意这里实际上内存里面有两个VALUE对象了!所以SENCOND打印出来的V.I是刚生成的,值就是15.前面的是20.中间的0没什么好说的!

#3


代码的执行顺序是
Test t = new Test();
t.first();调用方法first()
int i = 5; 
Value v = new Value(); 
v.i = 25; 
second(v, i); 调用方法second(),此时i=5,v.i=25
Value val = new Value();
i = 0; 
v.i = 20; 此时i=0,v.i=20
Value val = new Value(); 
v = val; 此处改变了引用,此时i=0,v.i=15而firsi()中的v.i仍然等于20
System.out.println(v.i + " " + i); 此时i=0,v.i=15
System.out.println(v.i); 此句在first()中,此处v.i=20

楼主看看这个《献给Java初学者》
http://blog.csdn.net/KingWolfOfSky/archive/2009/08/13/4444231.aspx

#4


画下内存应该就明白了

#5


引用的问题  我感觉考的还是参数传进函数中引用内存

#6


值传递和引用传递的问题。JAVA都是值传递。

#7


解题步骤内存分析:

首先执行方法first中前3句:
int i = 5;
Value v = new Value();
v.i = 25;
执行后的内存图:
SCJP中的一道题

然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
SCJP中的一道题

紧接着:
v = val;
形参v现在和val指向相同的对象
SCJP中的一道题
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0

然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
SCJP中的一道题
执行System.out.println(v.i);
打印结果为:
20

#8


楼主可不可以给点分意思意思?谢谢了~

#9


该回复于2009-10-14 12:41:39被版主删除