class Val{public int i = 10; } //成员变量i 
public class PassByValue{
    public static void main(String argv[]) {
        PassByValue o = new PassByValue();
        o.aMethod();
    }
    public void aMethod(){
        int i = 99;//局部变量i
        Val v = new Val();
        v.i=30; //成员变量i
        another(v, i); // 30, 99
        System.out.println(v.i);
    }
    public void another(Val v,int i){//30,99值传递
        v.i = 20;
        Val vh = new Val();
        v =  vh;
        System.out.print(v.i+" "+i+" ");//10   99
     }
}
输出为 10  99  2010和99能理解,但20是怎么出来的我就是搞不懂,郁闷!

解决方案 »

  1.   

    another(v , i) 参数列表中的v是一个对象(Val),而不是“30”,由于是地址传递v = vh; 让它指向了一个新的Val对象所以当another方法结束后System.out.println(v.i);时,这里的v.i实际是vh.i的值
      

  2.   

    最开始的val对象在another中被赋值为20
      

  3.   

    to:bigelf(好好学习,天天向上) “所以当another方法结束后System.out.println(v.i);时,这里的v.i实际是vh.i的值”对呀,所以回到aMethod()中再次输出v.i的时候也应该是10呀,而为什么是20了呢?
      

  4.   

    问题的关键在于考察java传递参数的方式通过传值的方式传递引用这句话理解透了,问题也就很简单了
      

  5.   

    class Val{public int i = 10; } //成员变量i 
    public class PassByValue{
        public static void main(String argv[]) {
            PassByValue o = new PassByValue();
            o.aMethod();
        }
        public void aMethod(){
            int i = 99;//局部变量i
            Val v = new Val();//v.i=10
            v.i=30; //成员变量i
            another(v, i); // v.i=30, 99
            System.out.println(v.i);//所以这里不是输出10而是20
        }
        public void another(Val v,int i){//30,99值传递
            v.i = 20;//v.i=20
            Val vh = new Val();
            v =  vh;//v.i=10;注意这里已经断开了another方法中局部变量v与aMethod局部变量的关系,所以即这里的v与aMethod的v不再是同一个对象引用了。
            System.out.print(v.i+" "+i+" ");//10   99
         }
    }