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; 
  int b= 0;                                                             
  ValHold v =new ValHold();
  System.out.println(v.i);//10
  System.out.println(i); //99                                         
  v.i=30; 
  b=v.i;                                                          
  another(v,b);                                                    
  System.out.println(v.i);                                            
}//End of amethod 
                                                           
public void another(ValHold v,int i){                                        
  i=0;                                                                  
  v.i=20;                                                            
  ValHold vh =new ValHold();                                               
  v = vh;                                                                  
  System.out.println(v.i);                                                                                                                     
}//End of another
                                                                         
}    
/*正确答案:
10
99
10  
20
请问为什么不是
10
99
10
30  
*/         

解决方案 »

  1.   


    public void another(ValHold v,int i){                                        
          i=0;                                                                  
          v.i=20;                                                            
          ValHold vh =new ValHold();                                               
          v = vh;                                                                  
          System.out.println(v.i);                                                                                                                   }
    another函数中的v首先指向主函数中的V,然后v.i被改为20,最后another函数中的v又指向vh,此时主函数中的v.i已经被改为了20
      
      

  2.   

    对象之间的传值和传引用问题。
    好好理解下,理解透了就理解了传值和传引用了
    本人觉得java中都是传值,不存在传引用,那样会更好理解一些东西
      

  3.   

    当最后一步时
    public void another(ValHold v,int i)
    {                                        
          i=0;                                                                  
          v.i=20;                                                            
          ValHold vh =new ValHold();                                               
          v = vh;                                                                  
          System.out.println(v.i);                                                                                                                     
        }
    v.i已经是20了,没有改变,所以最后打印出的是20
    这只是考查了一个引用关系
      

  4.   

    仍然是参数传递的问题
     public void another(ValHold v,int i){                                        
          i=0;                                                                  
          v.i=20; 
    //到此时,这里的v与amethod中的v指向同一个对象,因此v.i = 20改变了该对象的i,也就是说amethod中的v.i已经变为20,而不是30了。                                                           
          ValHold vh =new ValHold();                                               
          v = vh;                                                                  
    //现在,v与amethod中的v指向了不同的ValHold对象,这里的v.i = 10, 而amethod中的v.i仍为20  System.out.println(v.i);                                                                                                                     
        }//End of another所以打印出的自然就是
    10
    90
    10
    20