Java - Objektstatus ändert sich nicht nach Methodenaufruf [duplizieren]

7

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%     
Anand Hemmige 03.08.2012, 18:46
quelle

5 Antworten

16

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.

    
Jon Skeet 03.08.2012, 18:49
quelle
4

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

ändern     
pb2q 03.08.2012 18:47
quelle
0

Weil Sie für den String nur die lokale Parameterreferenz ändern.

    
kgautron 03.08.2012 18:49
quelle
0

t zeigt auf ein neues Objekt und ist nur auf Methode beschränkt, so dass Änderungen außerhalb nicht sichtbar sind.

Im zweiten Fall wird der Wert, den Sie ändern, auf das Objekt aktualisiert, sodass diese Änderungen nach dem Methodenaufruf sichtbar sind.

    
kosa 03.08.2012 18:47
quelle
0

Funktioniert nicht, da String ein unveränderliches Objekt ist

    
Roberto 01.06.2016 20:47
quelle