Java 只有傳值,沒有傳址

2007/12/26
~ 阿亮 ~

Java 是否有傳址 (pass by reference)?根據這裡 ,Java 是只有傳值 (Pass by value) 的,最近才搞懂的觀念 

在 Java 下,有兩種類型變數,分別為 primitive data 以及 object references,這兩種都是用傳值的方式。

primitive data 的例子如下,印出來的值為 0.

int x = 0;
giveMeATen (x);
System.out.println (x);
[...]

void giveMeATen (int y)
{
    y = 10;
}

同樣的,object references 在下面的例子也是 return null 的

Object x = null;
giveMeAString (x);
System.out.println (x);
[...]

void giveMeAString (Object y)
{
    y = "This is a string";
}

可以想像上述即做類似下面的事,傳進去 method 是 Object 的值(其實可以視為一個「指標」Object 指到 “This is a string” 或 null 這些 references,而傳進去是這個 Object,而非 references)

// Before the method call
Object x = null;
// Start of method call - parameter copying
Object y = x;
// Body of method call
y = "This is a piece of string.";
// End of method call
System.out.println (x);

傳址的缺點如下:

  • Pass by reference mixes inputs and outputs of code:傳址會混淆 Input and Output Code,在 Java 只要有進入 method 的變數,內容是不會改變。
  • Pass by reference confuses the interface to a method:傳址會混淆 method 的介面使用。

傳址的優點如下,在 Java 有其他替代的做法,但習慣一個 method 有多個 Input、多個 Output 以及多個 Input-Output 參數的人,可能就不習慣了:

  • 傳址可以減少 method 的呼叫,以及避免 data 的拷貝情形。這在 Java 內不是問題,因為在 Java 在傳大型資料的 object 時,是傳 object 的值,而不是內容。
  • 傳址可以改變傳入的變數,在 Java 就是要改寫成 return value 的方式,比如
      a = someMethod(a);
  • 若是要改變多個變數,則這些變數包裝成一個 class object 傳入,再回傳 class object 的方式來處理。

傷腦筋了, AdaCS 是有 In-Out Parameter 的,若要用 Java bytecode 來實做這個,就有點小麻煩了。



4 Responses to “Java 只有傳值,沒有傳址”

站內搜尋



本站其他服務

本站其他軟體



  • 下一班火車 (nextRail)

    這個 app 只要開啟後,就根據定位幫你過濾出最近火車站的時刻表,不用再按任何按鈕了,方便您在很快時間內確定要坐的哪一班火車


  • 藝文快訊

    讓你可以輕鬆追蹤含有您想要關注關鍵詞的任何藝文活動訊息,只要有最新的資訊,「藝文快訊」即會推播通知給你.


  • 下一台單車(NextBike)

    打開定位即搜尋附近二十點自行車站點,不塞滿全部站點資料到整個地圖上,所以畫面簡潔方便看清楚目前所在地,若需要搜尋地圖其他位置附近站點,再點擊地圖即可。


  • 姓名筆畫吉凶查詢系統

    這是一個提供中文字康熙筆畫的小軟體,並根據農民曆計算每個名字或公司名的總筆畫以及最後的吉凶數,共有四種模式


  • 標案快訊

    讓你可以輕鬆追蹤含有您想要關注關鍵詞的任何採購標案,只要有最新的資訊,「標案快訊」即會推播通知給你.


  • 條碼掃描器(QRCode)

    支援 QRCode and Barcodes、可連續快速掃描、自動對焦、可打開手電筒供掃描時使用