Java 中的引用傳遞

Aryan Tyagi 2023年10月12日
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