1. 程式人生 > >關於java中的“引用”概念

關於java中的“引用”概念

ref 討論 引用 stub 前言 clas 中一 按值傳遞 基本

前言

最近在閱讀《java編程思想》一書時,對作者關於java中的”引用(句柄)“的解釋不太清楚,因此以實驗的方式來討論下java中一切皆”按值傳遞“這一說法,從而加深理解。

正文

情景一:當參數為基本數據類型(如:int)時

public class TestReference {
    public static void testOne(int i){
        i = 2;
        System.out.println("test函數中的變量值:" + i);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a = 1;
        TestReference.testOne(a);
        System.out.println("main函數中的變量值:" + a);
    }
}

運行結果:
test函數中的變量值:2
main函數中的變量值:1
由此可見:當參數為基本數據類型時,參數的傳遞為按值的拷貝傳遞

情景二:當參數為對象時,出現“按引用傳遞”的效果

package test;

public class TestReference {
    public static void testTwo(B c){
        c.data = 2;
        System.out.println("test函數中的變量值:" + c.data);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        B b = new B();
        b.data = 1;
        TestReference.testTwo(b);
        System.out.println("main函數中的變量值:" + b.data);
    }
}

運行結果:
test函數中的變量值:2
main函數中的變量值:2
由此可見:此例中函數的參數確實以拷貝地址的方式操作了實參變量。

情景三: 函數中對參數創建新的對象

public class TestReference {
    public static void testThree(String str){
        str = new String("new");
        System.out.println("test函數中的變量值:" + str);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = new String("old");
        TestReference.testThree(str);
        System.out.println("main函數中的變量值:" + str);
    }
}

運行結果:
test函數中的變量值:new
main函數中的變量值:old
由此可見:實參變量以拷貝地址的方式將對象地址傳遞給了形參變量,但在函數運行過程中,形參變量被賦予的新的對象的地址,因此此後對形參變量的操作與實參變量便不再有關系。

總結

所謂“一切皆傳值”對於基本數據類型,指的便是變量值得拷貝,而對於對象(或String、Integer等包裝基本類型),指的是對象地址的拷貝,也就是說所傳遞的值是對象的地址。

關於java中的“引用”概念