在 Java 中,經常會出現關於物件傳遞機制的誤解。本文將深入探討兩個程式碼片段之間的區別,闡明 Java 參數傳遞行為的基本原理。
代碼A:
Foo myFoo; myFoo = createfoo(); public Foo createFoo() { Foo foo = new Foo(); return foo; }
代碼B:
Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }
與流行的看法相反,Java 使用按值傳遞,而不是按引用傳遞。這意味著當一個物件作為參數傳遞時,會建立其引用的副本,而不是直接引用原始物件。
在第一行中,myFoo 是已宣告但未指派。第二行呼叫 createFoo 方法,該方法傳回指派給 myFoo 的新 Foo 物件。此賦值會建立一個與該方法中建立的物件不同的新物件。
相反,程式碼 B 將 myFoo 引用作為參數傳遞給 createFoo 方法。在該方法中,建立一個新的 Foo 物件並將其指派給 foo 參數。隨後,foo 被分配給 a,它是方法內的局部變數。此重新分配有效地修改了本地引用 foo,而不是原始引用 myFoo。
為了說明概念,請考慮以下類別:
public class Foo { private String attribute; public void setAttribute(String attribute) { this.attribute = attribute; } }
主類:
public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // Attempt to change reference modifyReference(f); // Attempt to modify object attribute } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; } public static void modifyReference(Foo c) { c.setAttribute("c"); } }
主類:
main方法之後建立Foo 的實例並將其指派給f,它呼叫changeReference,它嘗試將 a引用重新分配給不同的物件。但是,這不會改變 f 引用。 相反,modifyReference 修改 c 引用的物件的屬性,該物件與 f 是同一個物件。這表示引用傳遞創建的是引用的副本,而不是物件本身。 結論Java 的值傳遞方法透過保護原始物件免於其範圍之外的無意修改來確保物件不變性。這項原則促進了封裝並有助於創建健壯且可預測的程式碼。以上是Java 是按值還是按引用傳遞物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!