class ValHold{
public int i=10;
}
public class ObParm{
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);
} public static void main(String arg[]){
ObParm o= new ObParm();
o.amethod();
}
}输出结果是 10 0 20
前面10 0 可以理解
但是 最后为什么会输出20
v=vh不是应该v引用vh的地址了么?

解决方案 »

  1.   

    csdn怎么老是这么慢啊最近所以说java是值传递 实参与形参是正副本关系
    对于引用类型而言 形参所引对象内容的改变能改变实参引用对象
    但引用本身的改变(v = vh) 对实参是没有影响的 它们彼此独立
      

  2.   

    调用的时候,有2个变量指向了同一个ValHold
    一个是amethod里面的v
    另一个是another里面的参数 v在里面将v.i设置为20
    然后参数的v指向了另一个vh
    但此时,amethod里面的v依然指向了原来的v所以 = 20
      

  3.   

    public void amethod()方法里的这一句 System.out.println(v.i); 
    输出 20
      

  4.   


    public void another(ValHold v,int i){ 
    i=0; 
    v.i=20; 这里的v和amethod()中的v指向同一个对象,但不是同一个v,在这里它将对象的i变成了20
    ValHold vh=new ValHold(); 
    v=vh; 
    System.out.println(v.i+" "+i); 
    } ValHold v,int i是这个函数的局部变量,这个函数结束后,这两个变量就会消失,但那个对象不会消失。将参数的名字变一下,可以帮助你理解。class ValHold{ 
    public int i=10; 

    public class ObParm{ 
    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 a,int i){ 
    i=0; 
    a.i=20; 
    ValHold vh=new ValHold(); 
    a=vh; 
    System.out.println(a.i+" "+i); 
    } public static void main(String arg[]){ 
    ObParm o= new ObParm(); 
    o.amethod();