2016-06-28 6 views
-1

Wenn ich eine Klasse habe, CatFrame, die JFrame erweitert dann setze ich myCat = new CatFrame(); dann später mache ich myCat = new CatFrame(false);. Ist der alte CatFrame für die Garbage Collection geeignet?Wird die Objektreferenzvariable neu zugewiesen, wird das alte Objekt gelöscht?

public class CatFrame extends JFrame{ 
    public CatFrame(){ 
     this.setVisible(false); 
    } 

public CatFrame(boolean b){ 
     this.setVisible(false); 
    } 
} 
+0

siehe [Entfernen Top-Level-Container auf Runtime] (http://stackoverflow.com/ questions/6309407/remove-top-level-container-on-runtime) – mKorbel

Antwort

8

Sie müssen vorsichtig mit Swing-Komponenten sein, die Window erweitern, wie JFrame und JDialog, da sie Peer-Komponenten haben, die nicht als Garbage Collected erfasst werden. Um ein Fenster korrekt zu öffnen, verwenden Sie Window.dispose();

Aber sonst, wenn ein Objekt auf dem Heap ist nicht erreichbar von jedem aktiven Thread, das Objekt ist, die für die Garbage Collection

1

Ja. Sie ersetzen "alten" CatFrame durch den "neuen", so dass der "alte" CatFrame vom Garbage Collector gesammelt werden kann, da er von Ihrem Programm in keiner Weise mehr zugänglich ist (wenn das die einzige Referenz wäre).

EDIT:

JFrames und andere solche Objekte sind wenig obwohl heikel. Siehe ControlAltDel's Antwort.

+0

Es sei denn, der Verweis auf das alte Objekt wurde vor der Neuzuweisung beibehalten. –

+2

Oder das Objekt ist ein Fenster, das gezeigt wurde. Siehe Window.dispose() – ControlAltDel

+0

Falsch, Frames müssen entsorgt werden, UI-Stack kann einige Objekte, insbesondere Frames, beibehalten. –

Verwandte Themen