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);
傷腦筋了, AdaCS 是有 In-Out Parameter 的,若要用 Java bytecode 來實做這個,就有點小麻煩了。
請教一下
JAVA中沒有傳址
但也有在其他JAVA書上提到的有關傳址
指是看過也還不是很了解既然沒有傳址
那JAVA的傳址呼叫是如何運作的?
這個我就不清楚了。
好喜欢文章顶上那张图片。呵呵~~
謝謝