it-swarm.com.de

Instanziierung mehrerer gleicher Objekte

Was genau passiert in Java, wenn Sie dasselbe Objekt mehrmals instanziieren?

Zum Beispiel:

Test test = new Test();

dann werde ich es später noch einmal aufrufen, Test test = new Test(); wieder oder innerhalb einer Schleife. Wird die vorherige Instanziierung entsorgt?

8
userIsAMonkey
  1. jeder Aufruf new Test() erstellt eine neue Objektinstanz der Klasse Test
  2. test = new Test(); weist der Variablen test ein Referenz dieses Objekts zu
  3. Eine wiederholte Anweisung test = new Test() erstellt eine zweite Instanz von Test und weist die Referenz erneut der Variablen test zu, sodass die erste Referenz ersetzt wird.

Ob und wann die erste Instanziierung erfolgt, hängt jedoch davon ab. Die Laufzeitumgebung Java) verfolgt Verweise. Solange Verweise auf ein verwendetes Objekt vorhanden sind, wird das Objekt nicht entsorgt. Wenn sich die Referenz beispielsweise zwischen Schritt 2 und Schritt 3 befindet zur ersten Instanziierung wird woanders gespeichert (wie Test test2 = test;), und diese Variable befindet sich noch in Gültigkeitsbereich, wenn Schritt 3 auftritt, dann wird das erste Objekt nicht entsorgt, da test2 enthält noch einen Verweis darauf. Wenn es jedoch keine solche Aussage gibt und Schritt 3 den einzigen Verweis auf das erste Objekt weglässt, erfolgt eine Entsorgung dieses Objekts.

Beachten Sie, dass die Entsorgung selbst nicht sofort erfolgt, sondern manchmal später, wenn der Garbage Collector das nächste Mal ausgeführt wird. Dies ist jedoch unabhängig von der Semantik des diskutierten Codes, das ist nur eine Frage des Gedächtnisses und der Leistung.

16
Doc Brown

1: Einige Formulierungen: Wir instanziieren überhaupt keine Objekte, wir instanziieren Klassen, und das Produkt einer Klasseninstanziierung ist ein Objekt (auch als Instanz bezeichnet). Natürlich können wir eine Klasse so oft instanziieren, wie erforderlich, um mit jeder Instanziierung ein neues und anderes Objekt zu erstellen.

2: Wie auch immer, Sie können den von Ihnen vorgeschlagenen Code nicht haben:

Test test = new Test();
Test test = new Test();

sie können dies auch nicht haben:

for (i=0; i<3; i++) {
    Test test = new Test();
    Test test = new Test();
}

Keiner wird kompiliert, da der Teil Test test ist die Deklaration der Variablen test (vom Typ Test), und keine Sprache, einschließlich Java, erlaubt es, zweimal dieselbe Variable im selben Bereich zu deklarieren.

Sie können jedoch dieselbe Variable (wie der Name schon sagt) mehrfach mit unterschiedlichen Objekten wie folgt zuweisen:

Test test = new Test();
test = new Test();

In der ersten Zeile wird test deklariert und ein neu erstelltes Objekt zugewiesen. Die zweite Zeile weist test einem anderen Objekt zu, das ebenfalls neu erstellt wurde.

Beachten Sie auch, dass Verknüpfungen in Java zulässig sind:

for (i=0; i<3; i++) {
    Test test = new Test();
}

Diese Schleife deklariert test nicht dreimal. Es versteht sich, dass der Variablen test nacheinander drei neue unterschiedliche Objekte zugewiesen werden, die nur einmal deklariert werden. (Vergleiche mit der vorherigen Schleife).

3: Was passiert mit der Variablen test und den beiden Objekten vom Typ Test?

Der Variablen test wird zuerst die Referenz eines Objekts und dann eines anderen Objekts zugewiesen. Eine Variable behält nur die zuletzt zugewiesene Referenz bei.

Das erste Objekt vom Typ Test ist test nicht mehr zugeordnet. Wenn keiner anderen Variablen ihre Referenz zugewiesen wurde, kann das Programm in keiner Weise auf dieses Objekt zugreifen und ist daher unbrauchbar. Es wird vom System zur Speicherbereinigung berechtigt. Irgendwann wird das System (die JVM) seinen Garbage Collector ausführen, wodurch er aus dem Speicher gelöscht wird.

Das zweite Objekt wird so lange leben, wie mindestens eine Variable darauf verweist. Der Garbage Collector kümmert sich ebenfalls darum und bringt es zum Friedhof für nicht referenzierte Objekte. Das ist das wahre Leben von Java Objekten :-(

5
mins