In Java kommt es häufig zu Missverständnissen hinsichtlich der Objektübergabemechanismen. Dieser Artikel befasst sich mit der Unterscheidung zwischen zwei Codeausschnitten und beleuchtet die Grundprinzipien des Parameterübergabeverhaltens von Java.
Code A:
Foo myFoo; myFoo = createfoo(); public Foo createFoo() { Foo foo = new Foo(); return foo; }
Code B:
Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }
Entgegen der landläufigen Meinung verwendet Java die Übergabe von Werten, nicht die Übergabe von Werten durch Verweis. Das bedeutet, dass, wenn ein Objekt als Argument übergeben wird, eine Kopie seiner Referenz erstellt wird und nicht eine direkte Referenz auf das Original.
In der ersten Zeile ist myFoo deklariert, aber nicht zugewiesen. Die zweite Zeile ruft die Methode createFoo auf, die ein neues Foo-Objekt zurückgibt, das myFoo zugewiesen ist. Diese Zuweisung erstellt ein neues Objekt, das sich von dem innerhalb der Methode erstellten unterscheidet.
Im Gegensatz dazu übergibt Code B die myFoo-Referenz als Argument an die Methode createFoo. Innerhalb der Methode wird ein neues Foo-Objekt erstellt und dem foo-Parameter zugewiesen. Anschließend wird foo a zugewiesen, einer lokalen Variablen innerhalb der Methode. Durch diese Neuzuweisung wird effektiv die lokale Referenz foo geändert, nicht die ursprüngliche Referenz myFoo.
Um die Konzepte zu veranschaulichen, betrachten Sie die folgende Klasse:
public class Foo { private String attribute; public void setAttribute(String attribute) { this.attribute = attribute; } }
Hauptklasse:
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"); } }
Nachdem die Hauptmethode eine Instanz von Foo erstellt und f zugewiesen hat, ruft sie changeReference auf, das versucht, die Referenz einem anderen Objekt neu zuzuweisen. Dies ändert jedoch nichts an der f-Referenz.
Im Gegensatz dazu ändert modifyReference das Attribut des von c referenzierten Objekts, bei dem es sich um dasselbe Objekt wie f handelt. Dies zeigt, dass die Referenzübergabe eine Kopie der Referenz und nicht des Objekts selbst erstellt.
Javas Ansatz zur Wertübergabe stellt die Unveränderlichkeit von Objekten sicher, indem Originalobjekte vor unbeabsichtigten Änderungen außerhalb ihres Gültigkeitsbereichs geschützt werden. Dieses Prinzip fördert die Kapselung und erleichtert die Erstellung von robustem und vorhersehbarem Code.
Das obige ist der detaillierte Inhalt vonÜbergibt Java Objekte nach Wert oder Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!