public void another(ValHold v1, int i){ 
i=0; 
v1.i = 20; 
ValHold vh = new ValHold(); 
v1 = vh; 
System.out.println(v1.i+ " "+i); 
}
这样看是不是好点
相当于
v1=v,指向同一地址
所以v1.i=20时,v.i也为20
v1=vh后,和v就不指向同一地址了,但v仍然是存在的
所以
v1.i=10

v.i=20你可以用
System.out.println(v.toString());
查看v地址的变化情况。

解决方案 »

  1.   

    class ValHold{ 
    public int i = 10; 

    public class ObParm{ 
    public static void main( String args[] ){ 
    ObParm o = new ObParm(); 
    o.amethod(); 

    public void amethod(){ 
    int i = 99; 
    ValHold v = new ValHold(); 
    v.i=30; 
    another(v,i); //改变了对象v里面的i,不是这里的i,输出20
    System.out.println(v.i); 

    public void another(ValHold v, int i){ 
    i=0; 
    v.i = 20; 
    ValHold vh = new ValHold(); 
    v = vh; //把对象转换成对象vh,v.i就是10
    System.out.println(v.i+ " "+i); //i是这里的变量0

    }  
      

  2.   

    java 中没有指针的概念,不过,我想,用指针的说法比较容易理解。
    当程 序执行到another(v,i)时,给函数another传入了对象v的指针
    这时候,相当于有两个指针指向对像v,为了便于理解,把做为参数传过去的指针叫做v1。
    在 another(v,i)函数中的v.i = 20语句时,v与v1指向的还是同一个地址,它们的i值都是20
    到了下一句v = vh的时候 ,实际上就是改变了指针v1的指向,v1就指向了vh的地址,i值为10,
    而此时,v还保持不变,所以还是20不知道说得是否明白