Java 中的引用傳遞
指標是程式語言體系結構中的一個變數,它隱式地監視特定資料的地址。另一個變數的等價物稱為引用。對參考變數所做的任何修改都會對原始變數產生直接影響。
Java 是一種傳值語言。它在其規範中宣告它從來不是一種傳遞引用語言。在 Java 中,由於引用的二義性,這兩個術語之間存在很多混淆。我們將在這篇文章中試圖澄清它。
讓我們討論按值傳遞。在這裡,形式引數的值被複制到用於在方法/函式執行期間儲存它的位置。這個位置通常有一個為此目的分配的記憶體塊。
在傳遞引用中,形式引數的值被複制到用於在方法/函式執行期間儲存它的位置。這個位置通常有一個為此目的分配的記憶體塊。
Java 被提升為一種健壯且安全的語言,Java 的一個好處是它不像 C++ 那樣啟用指標。他們甚至為這個概念選擇了一個不同的術語,正式將它們稱為參考
。
掌握這一點的關鍵是考慮諸如
Object Obj;
它是一個指向 Object
的指標,而不是一個 Obj
。術語引用在 Java 中被誤解,並且是大多數混淆的根源。在其他程式語言中,他們稱之為引用作為指標工作。
當我們談論 Java 中的物件時,我們談論的是稱為引用的物件控制代碼,它們也是由值提供的。
在上面的程式碼中,你有效地將構造的物件
地址傳送到方法。
Java 與 C 的相似之處在於它是一種過程語言。你可以分配一個指向方法的指標,將其傳送到那裡,在方法內部跟蹤它,並更改它指向的資料。另一方面,你對指標位置所做的任何更改都不會被呼叫者注意到。(在傳遞引用語言中,方法函式可以在呼叫者沒有意識到的情況下更改指標。)
考慮替換傳入變數的引用引數。我們傳入的變數是在分配別名時分配的。
讓我們通過兩種情況更好地理解這一點。
如果我們改變物件本身並將其指向另一個地方或物件,則不會反映更改。如果我們將引用指向不同的地方,則更改將不會反映在 main()
函式中。
請參考下面的程式碼。
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
// reference changed to some other location any changes not reflected
O = new Object();
O.x = 8;
}
}
輸出:
7
現在,假設我們不分配對新地址或物件的引用。在這種情況下,結果會被映象回來:你可以對成員進行修改。如果我們不更改引用以引用另一個物件(或記憶體位置),則會反映這些更改。
例如,
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
O.x = 8;
}
}
輸出:
8