Frage

Wenn ich eine Membervariable wie diese (in den Körper einer Klasse deklariert)

private Dot[] dots=new Dot[numDots];

I Schleife durch alle Mitglieder dieser Reihe, und:

1) Führen Sie jeden Punkt Objekt zu einer Funktion einer anderen Klasse, die:

2) übergibt sie an eine weitere Funktion einer dritten Klasse, wenn einige Bedingungen erfüllt sind

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

dann, wenn dieses Objekt auf die ursprüngliche / Elternklasse zurückgeführt wird, hätte diese Änderungen ihrer Eigenschaften beibehalten? Oder wäre es wie eine lokale Variable durch den 2. / 3. Funktionen behandelt werden?

War es hilfreich?

Lösung

Ja, die Änderungen an den Eigenschaften beibehalten. Java ist 100% Pass-by-Wert, jedoch, wenn Sie ein Objekt übergeben, übergeben der „Wert“ auf das Objekt wirklich ein Zeiger ist. Wenn Sie also ein Objekt in einem Verfahren zu ändern, sind Sie das eigentliche Objekt übergeben zu ändern.

Das heißt, wenn Sie die folgende Methode, dann wird die anrufende Methode der Änderungen sehen:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

, aber wenn Sie die folgende tun, dann ist die Rufmethode wird nicht , um die Änderungen sehen.

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

Im zweiten Beispiel, der Anrufer wird nicht Änderungen sehen und das neu geschaffene Dot Objekt nicht sehen.

Andere Tipps

Die Objekte werden übergeben von [ Referenz Wert, bei dem der Wert der Referenz ] (Dinge, die von Object erben), primitive Werte (int, long, double usw. ) sind je nach Wert übergeben.

Das bedeutet, dass, wenn ein primitive von einem Anrufer an Methode übergeben wird es kopiert wird, während bei einem Objekt a [ Wert des ] Referenz übergeben wird.

Was wiederum bedeutet, dass, wenn ein Objekt durch ein Verfahren mutiert ist der Anrufer diese Änderungen sieht, weil es einen Verweis auf das gleiche Objekt hat.

Im Gegensatz dazu, wenn ein Verfahren ein primitives mutiert der Anrufer nicht die Änderungen nicht sehen, wie das Verfahren auf einer Kopie arbeitet.

[Grund für die Änderungen]

Wenn Java durch Verweis übergeben hatte, dann können Sie dies tun:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

wo foo ist wie folgt definiert:

void foo(Object o)
{
   o = new Float(43);
}

Da Java geht der Hinweis Wert o = new Float(43); ist erlaubt - aber der Wert in dem Anrufer bleiben als new Integer(42);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top