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