1. 程式人生 > >【java】的傳值方式

【java】的傳值方式

運行 有意義 class new main 一個人 結果 參數傳遞 傳遞參數

【java】的傳值方式

當你問大多數程序員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只有一種參數傳遞方式,那就是傳值。它簡單、有文檔可查並且確實是如此。

轉自http://www.blogjava.net/zsh118/articles/24564.html

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        int i = 5;
     System.out.println(a + "," + b + "," + i); operate(a, b, i); System.out.println(a
+ "," + b + "," + i); } public static void operate(StringBuffer x, StringBuffer y, int j) { x.append(y); y = x; y.append("C"); j = 1; } }

運行結果:

A,B,5
ABC,B,5

規律總結: Java參數,不管是原始類型還是引用類型,傳遞的都是副本 如果參數類型是原始類型,那麽傳過來的就是這個參數的一個副本,也就是這個原始參數的值,這個跟之前所談的傳值是一樣的。如果在函數中改變了副本的值不會改變原始的值. 如果參數類型是引用類型,那麽傳過來的就是這個引用參數的副本,這個副本存放的是參數的地址如果在函數中沒有改變這個副本的地址,而是通過地址改變改變了地址指向的值,那麽在函數內的改變會影響到傳入的參數。 如果在函數中改變了副本的地址,如當執行如a=其他對象,a=new等賦值操作時,實際上是將a指向新的位置,那麽函數外的原值不改變。 轉自:http://www.cnblogs.com/wangfeixiong/p/7158442.html

【java】的傳值方式