日期:2014-05-20  浏览次数:20756 次

scjp问题,tell me why~~
class   ValHold{
public   int   i=10;
}
public   class   test5{
public   static   void   main(String   arg[]){
test5   o=new   test5();
o.amethod();
}
public   void   amethod(){
int   i=99;
ValHold   v=new   ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);
}
public   void   another(ValHold   v,int   i){
i=0;
v.i=20;
ValHold   vh=new   ValHold();
v=vh;
System.out.println(v.i+ "   "+i);
}
}
答案是:10   0
                20
请行家详细解释为什么。谢谢咯。

------解决方案--------------------
在c++和java中,当函数的参数不是引用时,你传递的是值得副本(传值)。但是对于引用类型就不同了。在c++中,当参数是引用类型,你传递的是引用或者内存地址(传引用),而在java中,传递一个引用类型的参数的结果只是传递引用的副本(传值)而非引用自身。

程序执行到another(ValHold v,int i)时,传递的参数是v这引用的一个拷贝,于是在another(ValHold v,int i)中,通过这个引用的拷贝修改了其所指向的对象的成员变量的值,v.i=20;随后,这个
引用的拷贝又指向了一个新的对象
ValHold vh=new ValHold();
v=vh;
所以another(ValHold v,int i)中 System.out.println(v.i+ " "+i);
输出的是这个引用的拷贝指向的对象的成员变量i的值,10
第2个i是局部变量,被赋值为0;
回到amenthod,这里的v指向的对象没有变化,但是对象的成员变量i已经被another(ValHold v,int i)中的v(amethod中v的拷贝)所操纵修改赋值为20
所以输出结果为 10 0
20