首頁 > Java > java教程 > Java 如何處理傳遞物件:按值還是按引用?

Java 如何處理傳遞物件:按值還是按引用?

DDD
發布: 2024-11-11 03:18:02
原創
882 人瀏覽過

How Does Java Handle Passing Objects: By Value or by Reference?

Java 按值傳遞與引用傳遞:分析差異

在Java 中,參數是按值傳遞的,而不是按引用傳遞的。這個概念可能會令人困惑,尤其是在處理物件時。讓我們檢查一下兩個程式碼片段之間的細微差別:

程式碼A:

Foo myFoo;
myFoo = createfoo();
登入後複製

程式碼B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}
登入後複製

理解程式碼A

在程式碼 A 中,建立了一個引用變數 myFoo 並將其指派給 createfoo() 傳回的物件。然而,在Java中,物件是按值傳遞的,而不是按引用傳遞的。這表示建立了該物件的副本並將其指派給 myFoo。對此副本所做的任何變更都不會影響 createfoo() 中的原始物件。

理解程式碼 B

程式碼 B 使用參數 foo 的 createFoo() 函數。同樣,foo 是原始引用變數 myFoo 的副本。因此,當建立 f 並將其指派給 foo 時,它實際上取代了 createFoo() 中 myFoo 的副本。 createFoo() 中對 foo 所做的任何更改都會反映在原始 myFoo 引用變數中。

說明差異的範例

為了進一步闡明,請考慮以下範例:

public class Main {
   public static void main(String[] args) {
      Foo f = new Foo("f");
      changeReference(f); // Will not change the reference!
      modifyReference(f); // Will modify the object referred by "f"!
   }
   public static void changeReference(Foo a) {
      Foo b = new Foo("b");
      a = b;  // Re-assigns 'a' reference to the new object, not 'f'.
   }
   public static void modifyReference(Foo c) {
      c.setAttribute("c");  // Modifies the object referred by 'c', same as 'f'.
   }
   private static class Foo {
      private String attribute;
      public Foo(String attribute) { this.attribute = attribute; }
      public void setAttribute(String attribute) { this.attribute = attribute; }
   }
}
登入後複製

執行此程式碼時:

  • Foo f = new Foo("f");建立一個以「f」為屬性的物件。
  • changeReference(f);建立 Foo 物件的新副本,並指定「b」作為其屬性,但不會影響 f 引用的原始物件。
  • modifyReference(f);修改f指向的對象,將其屬性變更為「c」。

結論

在Java中,物件是按值傳遞的,這表示物件的副本作為參數傳遞。方法內對副本所做的任何變更都不會影響原始物件。但是,如果該方法修改物件本身(例如,透過更改其屬性),則原始物件將受到影響。在使用 Java 中的物件時,理解這個概念很重要,以避免潛在的混淆。

以上是Java 如何處理傳遞物件:按值還是按引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板