作者:臧圩人(zangweiren) 
网址:http://zangweiren.javaeye.com >>>转载请注明出处! < < < JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个问题前,让我们首先来看一段代码: 
Java代码 
public final class ParamTest {  
    // 初始值为0  
    protected int num = 0;  
  
    // 为方法参数重新赋值  
    public void change(int i) {  
        i = 5;  
    }  
  
    // 为方法参数重新赋值  
    public void change(ParamTest t) {  
        ParamTest tmp = new ParamTest();  
        tmp.num = 9;  
        t = tmp;  
    }  

  
    // 改变方法参数的值  
    public void add(int i) {  
        i += 10;  
    }  
  
    // 改变方法参数属性的值  
    public void add(ParamTest pt) {  
        pt.num += 20;  
    }  
  
    public static void main(String[] args) {  
        ParamTest t = new ParamTest();  
  
        // 为基本类型参数重新赋值  
        t.change(t.num);  
        System.out.println(t.num);  
        // 为引用型参数重新赋值  
        t.change(t);  
        System.out.println(t.num);  
  
        // 改变基本类型参数的值  
        t.add(t.num);  
        System.out.println(t.num);  
        // 改变引用类型参数所指向对象的属性值  
        t.add(t);  
        System.out.println(t.num);  
    }  
}  这段代码的运行结果如下: 0 


20 
为什么结果不是
0
9
0
29
红色那里 public void change(ParamTest t) 这个不是引用类型做参数啊
不是要改t的属性了嘛?
为什么得出来不是9而是0?

解决方案 »

  1.   

    因为  ParamTest tmp = new ParamTest();  他是一个内部的变量 在此方法结束的时候并不能被外部引用到了。
      

  2.   

    红色那里 public void change(ParamTest t) 这个不是引用类型做参数啊 
    不是要改t的属性了嘛? 
    为什么得出来不是9而是0? 是引用传递,将 实参t 传给 形参t,则 形参t 与 实参t 指向同一个对象;
    方法里改变了 形参t的指向为tmp但 实参t 的指向并未变;
    只有当你改变 形参t 的属性时,改变才会保留(这时2个t指向同一个对象,实际改变的是这个对象的属性)
      

  3.   

        public void change(ParamTest t) {  
            ParamTest tmp = new ParamTest();  
            tmp.num = 9;  
            t = tmp;  
        }    public void add(ParamTest pt) {  
            pt.num += 20;  
        } 
    其实上面2段代码正好解释这点,第一段是改变了形参t的指向(引用),它与传入的实参t的指向就不同了,因此改边不做保留;
    第二段是改变了属性,而指向未变,因此对形参t的改变即是对实参t的改变;
    一定要明白引用类型的含义;