總網頁瀏覽量

2013年2月1日 星期五

傳址呼叫vs傳值呼叫

call by address:
呼叫端的引數與被呼叫端method的參數,指向同一個物件

ex:將物件或陣列傳給method,實際上只是傳該物件或陣列的參考給他而已
被呼叫端method裡面更改變數會影響呼叫端變數的值

call by value;
呼叫端的引數與被呼叫端的參數各自擁有自己的值
被呼叫端method裡面更改變數不會影響呼叫端變數的值

2 則留言:

  1. 不管是否為基本型態
    java傳遞的永遠是物件的實例
    該實例指向某記憶體位址(儲存其值)

    基本型態都是final class,其值無法覆寫
    傳給method時,如果變動其值,
    則產生新的實例,以指向新的記體位址
    如果沒變動其值,
    無須產生新的實例,仍指向同一物件實例

    並不是你所理解的「將變數的值複製給method的參數」
    沒有複製不複製的過程
    Integer check01(Integer iii){
    return iii;
    }
    Integer check02(Integer iii){
    iii += 1;
    return iii;
    }
    Integer iii = new Integer(1);

    System.out.println(iii==check01(iii));
    結果會是true,因為沒任何變動
    依然是原來那份物件實例,沒有所謂的複製過程

    System.out.println(iii==check02(iii));
    結果會是false,因為變動iii,實際上是產生新的物件實例
    與原來的iii已經是完全不同的物件了

    至於其他不屬於final class類別的物件實例
    就都會是同一份物件實例,指向同一位址,
    只是其儲值可能依需求被改變
    例如orm對應資料表欄位的pojo物件

    歡迎指教tsaipifong@gmail.com

    回覆刪除