Java-Objektreferenz / Bereichsfrage

8

Wenn ich eine Membervariable wie diese habe (im Rumpf einer Klasse deklariert)

%Vor%

Ich durchlaufe alle Mitglieder dieses Arrays und:

1) Übergeben Sie jedes Dot-Objekt an eine Funktion einer anderen Klasse, die:

2) Übergibt es an eine weitere Funktion einer 3. Klasse, wenn einige Bedingungen erfüllt sind

3) Und die 3. Klasse ändert einige Eigenschaften des Dot-Objekts

Wenn dieses Objekt dann an die ursprüngliche / übergeordnete Klasse zurückgegeben wird, würden diese Änderungen an seinen Eigenschaften beibehalten? Oder würde es wie eine lokale Variable von der 2./3. Funktion behandelt werden?

    
Click Upvote 08.03.2009, 02:59
quelle

2 Antworten

12

Ja, die Änderungen an den Eigenschaften bleiben erhalten. Java ist 100% pass-by-value, aber wenn Sie ein Objekt übergeben, ist der übergebene "value" wirklich ein Zeiger auf das Objekt. Wenn Sie also ein Objekt in einer Methode ändern, ändern Sie das übergebene Objekt.

Das heißt, wenn Sie die folgende Methode haben, sieht die aufrufende Methode die Änderungen:

%Vor%

Wenn Sie jedoch Folgendes tun, sieht die aufrufende Methode nicht die Änderungen.

%Vor%

Im zweiten Beispiel sieht der Aufrufer nicht Änderungen und das neu erstellte Objekt Dot wird nicht angezeigt.

    
Eddie 08.03.2009, 03:01
quelle
2

Objekte werden übergeben durch [ reference Wert, wobei der Wert die Referenz ist (Dinge, die von Object erben), primitive Werte (int, long, double usw.) ) werden nach Wert übergeben.

Dies bedeutet, dass wenn ein Primitiv von einem Aufrufer an eine Methode übergeben wird, es kopiert wird, während bei einem Objekt ein [ Wert der ] Referenz übergeben wird.

Dies wiederum bedeutet, dass der Aufrufer diese Änderungen sieht, wenn ein Objekt von einer Methode mutiert wird, da es einen Verweis auf dasselbe Objekt hat.

Umgekehrt, wenn eine Methode ein primitives Element ändert, sieht der Aufrufer die Änderungen nicht, wenn die Methode an einer Kopie arbeitet.

[Grund für die Änderungen]

Wenn Java als Verweis übergeben wurde, können Sie Folgendes tun:

%Vor%

wobei foo wie folgt definiert ist:

%Vor%

Da Java den Verweis nach Wert übergibt, ist o = new Float(43); erlaubt - aber der Wert im Aufrufer bleibt als new Integer(42);

erhalten     
Tom 08.03.2009 03:35
quelle

Tags und Links