〔轉貼〕java中的參數傳遞(一)

原始地址:Java傳遞參數

 

Java傳遞參數

作者: Builder.com
Wednesday, March 3 2004 12:13 PM

 

advertisement_e1.gif
code;sz=1x1;ord=54671579?

當你問大多數程序員Java是傳值還是傳引用的時候,你可能會得到兩種答案之一:(1)Java傳遞原始類型數據時使用的是傳值方式;傳遞對象時則使用傳引用方式;String類型的數據採用的是傳值方式,因爲字符串是不可變的。(2)Java傳遞所有參數都使用傳值方式。

只有第二個答案是正確的。理解傳值和傳引用的區別的關鍵是要記住,當你向一個方法傳遞一個對象時,Java沒有把對象放入堆棧,它只是拷貝對象的引用然後將這個引用的拷貝放入堆棧。也就是說,根據定義,Java使用的是傳值方式。

證明

如果Java通過傳引用方式傳遞對象,那麼執行下面的代碼就會交換保存在兩個變量a和b中的引用,而相應的輸出應該如下:

a: 4
b: 100
Swapped!
a: 100
b: 4

其實真正的動作是在方法的參數o1和o2中的引用,它並不影響原始變量a和b。下面是其實際輸出:

a: 4
b: 100
Swapped!
a: 4
b: 100

public class SwapTip {
    public static void main(String []args) {
        Integer a = new Integer(4);
        Integer b = new Integer(100);

        System.out.println("a: " + a);
        System.out.println("b: " + b);

        swap(a, b);

        System.out.println("Swapped!");
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }

    public static void swap(Object o1, Object o2) {
        Object t = o1;
        o1 = o2;
        o2 = t;
    }
}

爲什麼說這個爭論的答案是有意義的?

很多參與過爭論傳遞參數的方式的程序員最後都會說:“只是語義不同而已”或者是“沒有關係,因爲都理解它真正的工作原理。”

對於有經驗的程序員來說這可能是一個語義問題,但是對於那麼沒有什麼經驗的程序員來說,情況就不一樣了。對於程序員來說一個語言的黑拿越少,他們在用那種語言寫程序的時候就能做得越好。

一個類比

對象引用與實例的關係就像遙控器與電視機的關係,引用控制對象就像遙控器控制電視機一樣。如果一個遙控器的複製品給了另一個人,那麼那個人也可以控制電視機。複製的遙控器對電視機的動作(比如說調節音量、改換頻道或者調節時鐘)對於它本身和原裝遙控器來說都是可見的。如果那個人改裝了複製的遙控器去控制另外一臺電視機,那麼原來的遙控器不會受到影響。

誠然,Java是通過傳值還是傳引用的方式來傳遞參數只是一個學術上的區別,只要我們知道期望哪種行爲即可。但是有時候知道臺後的事情也是重要的。

Java只有一種參數傳遞方式,那就是傳值。它簡單、有文檔可查並且確實是如此。所以在下次你聽到這個問題的時候你就會知道正確答案。


本文作者: David Petersheim是Genscape公司的一位資深Java 開發人員。他設計和開發服務器端應用程序來獲取和處理實時能源數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章