Anfänger-Java-Frage, aber ich kann nicht verstehen, wie Call-by-Value (oder Reference) im folgenden Beispiel funktioniert -
Wie kommt es, dass der String-Wert nicht geändert wird, nachdem er die Methode beendet hat, während mein benutzerdefiniertes String-Objekt ist? ? Dasselbe gilt für andere Klassen wie Date ..
%Vor%Vergleichen Sie diese zwei Methoden:
%Vor% Im ersten Fall weisen Sie t
einen neuen Wert zu. Das hat keine Auswirkungen auf den aufrufenden Code - Sie ändern nur den Wert eines Parameters, und alle Argumente werden in Java als Wert übergeben.
Im zweiten Fall weisen Sie o.str
einen neuen Wert zu. Das ändert den Wert eines Felds innerhalb des Objekts , auf das sich der Wert von o
bezieht. Der Aufrufer sieht diese Änderung, weil der Aufrufer immer noch einen Verweis auf dieses Objekt hat.
Kurz gesagt: Java verwendet immer den Wert "pass by", aber Sie müssen daran denken, dass der Wert einer Variablen (oder eines anderen Ausdrucks) für Klassen eine Referenz und kein Objekt ist. Sie müssen die Parameterübergabe nicht verwenden, um dies zu sehen:
%Vor% Die zweite Zeile hier kopiert den Wert von foo1
in foo2
- die beiden Variablen beziehen sich auf das gleiche Objekt, es spielt also keine Rolle, auf welche Variable Sie zugreifen.
Es gibt einen wichtigen Unterschied zwischen den beiden Methoden: Mit hello(String)
versuchen Sie, die Referenz auf String
und mit hello(CustomObject)
auf eine Referenz zu setzen Verwenden der Referenz zum Ändern eines Elementes des Objekts.
hello(String)
bezieht sich auf String
. In der Funktion versuchen Sie, das Objekt zu ändern, auf das die Referenz verweist, aber Sie ändern nur die Wertvorgabe-Kopie der Referenz. Ihre Änderungen werden also nicht außerhalb der Methode angezeigt.
hello(CustomObject)
erhält eine Kopie eines Verweises auf ein Objekt, mit dem Sie dann das eigentliche Objekt ändern können. Betrachten Sie dies als Änderung des Inhalts des Objekts. So werden Ihre Änderungen im Aufrufer widergespiegelt.
Eine Referenz für ein Objekt vorausgesetzt, können Sie das Objekt mit den exposed Methoden / Feldern
ändernTags und Links java pass-by-value pass-by-reference