v.i = 20;   //改变了v的值10为20
  v =vh;     //又把20变为了10

解决方案 »

  1.   

    在调用another()函数的时候,v的值被改变为20。
    当v指向vh的时候,输出的是vh对象的值。
    当函数another退出,vh销毁,
    返回amethod的时候,v仍然是原来的对象,输出的就是被改变的值20。class ValHold{  
          public int i = 10;
          }
     class ObParm{       
         public void amethod(){                
            ValHold v = new ValHold();               
            System.out.println(v);       
            another(v);                
            System.out.println(v);       
            System.out.println(v.i);       
           }        
         public void another(ValHold v){               
             v.i = 20;               
            System.out.println(v);       
             ValHold vh = new ValHold();
             v =vh;               
            System.out.println(v);       
             System.out.println(v.i);        
              }       
         public static void main(String[] argv){                
             ObParm o = new ObParm();               
             o.amethod();        
       }
       }
      

  2.   

    其实java里用的全是引用,
    v.i = 20; 这句话虽然把v.i的值改变了               
    ValHold vh = new ValHold();
    v =vh;这两句又从声明了一个对象并且把新的引用给了v这样v合vh就都指向了新的对象,新的对象里i的值还是10没有改变    
    System.out.println(v.i);这时候println的是第二回new 的对象,他的i =10
    }  在括号结束的时候作为参数的v的生命周期也就结束了所以在外面的println打印的就是第一次new的v的i
    这个值被v.i = 20;   这句话改变了,因为这时候v还指向第一次new 的那个对象
    说得有点乱,不知道说没说明白中心思想就是,所有的都是引用,它改变的就是对象的值,不管生命周期如何