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,有谁知道解题步骤吗

解决方案 »

  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.   

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

  5.   

    解题步骤内存分析:首先执行方法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