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
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没什么好说的!
首先在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
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;
执行后的内存图:
然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
紧接着:
v = val;
形参v现在和val指向相同的对象
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0
然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
执行System.out.println(v.i);
打印结果为:
20
首先执行方法first中前3句:
int i = 5;
Value v = new Value();
v.i = 25;
执行后的内存图:
然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
紧接着:
v = val;
形参v现在和val指向相同的对象
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0
然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
执行System.out.println(v.i);
打印结果为:
20
#8
楼主可不可以给点分意思意思?谢谢了~
#9
#1
如果你了解函数传参,就明白为什么答案是15 0 20, 我的博客中对java传参做了总结,你可以看看:
http://blog.csdn.net/ostrichmyself/archive/2009/10/03/4630976.aspx
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没什么好说的!
首先在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
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;
执行后的内存图:
然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
紧接着:
v = val;
形参v现在和val指向相同的对象
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0
然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
执行System.out.println(v.i);
打印结果为:
20
首先执行方法first中前3句:
int i = 5;
Value v = new Value();
v.i = 25;
执行后的内存图:
然后进入方法second,首先复制形参v和i,然后执行方法体中的语句:
i = 0;
v.i = 20;
Value val = new Value();
执行前三句后的内存图:
紧接着:
v = val;
形参v现在和val指向相同的对象
此时System.out.println(v.i + " " + i);中的v为形参v(parameter),i为方法second中的局部变量i,外部的i(方法first中的)被屏蔽,所以打印的结果为:
15 0
然后方法second结束,其中的所有形参结束生命周期,线程返回到方法first中,此时内存图为:
执行System.out.println(v.i);
打印结果为:
20
#8
楼主可不可以给点分意思意思?谢谢了~