Ein Objekt in Java löschen?

99

Ich möchte ein von mir erstelltes Objekt löschen (ein Oval, das Ihnen folgt), aber wie würde ich das tun?

delete follower1;

hat nicht funktioniert.

BEARBEITEN:

Okay, ich werde etwas mehr Kontext geben. Ich mache ein kleines Spiel mit einem Oval, das du kontrollieren kannst, und einem Oval, das dir folgt. Jetzt habe ich Dateien mit dem Namen: DrawPanel.class, diese Klasse zeichnet alles auf dem Bildschirm und behandelt Kollisionen, Geräusche usw. Ich habe eine feindliche Klasse, die das Oval ist, das dem Spieler folgt. Ich habe eine entity.class, die der Spieler ist, den du steuern kannst. Und wenn sich der Player mit dem Follower überschneidet, soll mein Player-Objekt gelöscht werden. So wie ich es mache:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}
Stan
quelle
1
Können Sie etwas mehr Kontext bereitstellen?
Joseph Weissman
2
In Java werden keine Objekte gelöscht. Aber normalerweise müssen Sie nicht: Sie müssen sicherstellen, dass auf dem Bildschirm nichts mehr angezeigt wird (wenn dies das ist, was "Ihnen folgen" bedeutet).
Paŭlo Ebermann
Vielleicht möchten Sie versuchen, den Garbage Collector zu zwingen, ein Objekt zu entfernen? es ist eine Frage , über sie hier schon. Oder versuchst du vielleicht etwas anderes? Sie können versuchen, hier oder hier ein wenig über den Garbage Collector zu lesen. Wenn dies immer noch keine Hilfe ist, müssen Sie genauer sein.
Fawix
Mögliches Duplikat von Force explizites Löschen eines Java-Objekts
Ciro Santilli 法轮功 法轮功 病 :0 六四 法轮功
Wenn Sie Objektzuweisungen wirklich wirklich wirklich manuell verarbeiten möchten, verwenden Sie JNI: Erstellen Sie eine C / C ++ - Bibliothek, die aus Java-Code verwendet wird, aber alles (Erstellen, Löschen usw.) selbst erledigt - aber in Ihrer Bibliothek befindet sich C / C ++ - Code, kein Java. Ich habe keine Möglichkeit gesehen, ein Java-Objekt manuell zu löschen. Wenn Ihr Profiler Ihnen mitteilt, dass Probleme vorliegen, basieren diese Probleme häufig auf "vergessenen" Verweisen auf Objekte. In Ihrem Fall scheint es nirgendwo ein Problem zu geben.
Johannes

Antworten:

171

Sie sollten die Verweise darauf entfernen, indem Sie null zuweisen oder den Block belassen, in dem er deklariert wurde. Danach wird es vom Garbage Collector automatisch gelöscht (nicht sofort, sondern eventuell).

Beispiel 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Beispiel 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Nicht etwas, nach dem Sie gerade suchen, aber zu Ihrer Information : Sie können den Garbage Collector mit dem Aufruf System.gc () aufrufen.

MByD
quelle
23
Manuelles Aufrufen System.gc()ist im Allgemeinen keine gute Idee , da es von der JVM möglicherweise ignoriert wird.
cdeange
3
Keine gute Idee, aber Sie können auch ähnlich wie System .. Runtime.getRuntime (). Gc () aufrufen. Weitere Informationen: Die von Java bereitgestellten Garbage Collection-Routinen sind Mitglieder der Runtime-Klasse. Die Runtime-Klasse ist eine spezielle Klasse, die für jedes Hauptprogramm ein einzelnes Objekt (einen Singleton) enthält. Das Runtime-Objekt bietet einen Mechanismus für die direkte Kommunikation mit der virtuellen Maschine. Um die Runtime-Instanz abzurufen, können Sie die Methode Runtime.getRuntime () verwenden, die den Singleton zurückgibt.
Timo
1
Ist die nullZuweisung ein eindeutiges Zeichen für den GC, dass dieses Objekt beim nächsten GC-Aufruf bereinigt werden soll? * Durch das Zuweisen nullzu Sammlungsobjekten (Listen, Arrays) werden diese zur Reinigung markiert? stackoverflow.com/questions/449409/…
George Daramouskas
Also sollte ich alle meine Textansichten und Bildschaltflächen im onPause? Null machen .
Ruchir Baronia
Es gibt keine Garantie dafür, dass der Garbage Collector jemals ausgeführt wird oder dass er in diesem Fall ein bestimmtes Objekt sammelt (nicht "löscht").
Marquis von Lorne
64

Ihr C ++ wird angezeigt.

deleteIn Java gibt es kein und alle Objekte werden auf dem Heap erstellt. Die JVM verfügt über einen Garbage Collector, der sich auf Referenzzählungen stützt.

Sobald keine Verweise mehr auf ein Objekt vorhanden sind, kann es vom Garbage Collector gesammelt werden.

myObject = nulldarf es nicht tun; beispielsweise:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Alles, was dies tut, ist, die Referenz myObjectauf Null zu setzen. Es wirkt sich nicht auf das Objekt aus, auf das myObjecteinmal verwiesen wird, außer um einfach die Referenzanzahl um 1 zu verringern. Da es sich myOtherObjectimmer noch auf dieses Objekt bezieht, ist es noch nicht zum Sammeln verfügbar.

Brian Roach
quelle
Also sollte ich alle meine Textansichten und Bildschaltflächen im onPause? Null machen .
Ruchir Baronia
8
"Die JVM verfügt über einen Garbage Collector, der sich auf Referenzzählungen stützt." -> das ist eine sehr vereinfachte Erklärung. Es prüft, ob Objekte von einer bestimmten "Wurzel" aus erreichbar sind
Johannes
2
Die JVM verfügt über einen Garbage Collector, der sich speziell nicht auf Referenzzählungen stützt. Es hängt von der Erreichbarkeit ab. Wenn es sich auf Referenzzählungen stützte, konnte es niemals Zyklen sammeln, und das tut es auch.
Marquis von Lorne
14

Wenn Sie möchten, dass ein Objekt entfernt wird, setzen Sie seinen Verweis auf null.

String x = "sadfasdfasd";
// do stuff
x = null;

Wenn Sie den Verweis auf null setzen, ist es wahrscheinlicher, dass das Objekt durch Müll gesammelt wird, solange keine anderen Verweise auf das Objekt vorhanden sind.

John Percival Hackworth
quelle
Immer wenn ich das tue, wenn sich mein Objekt schneidet, friert mein gesamtes Spiel ein und das Objekt wird nicht gelöscht.
Stan
Weil Sie wahrscheinlich eine nicht erfasste Nullzeigerausnahme auslösen. Mehr Kontext würde uns sicherlich dabei helfen, Sie dabei zu unterstützen.
Joseph Weissman
Also sollte ich alle meine Textansichten und Bildschaltflächen im onPause? Null machen .
Ruchir Baronia
Wenn Sie sie wirklich brauchen, um wegzugehen, dann würde das es irgendwann tun.
John Percival Hackworth
3

Sie müssen keine Objekte in Java löschen. Wenn kein Verweis auf ein Objekt vorhanden ist, wird es vom Garbage Collector automatisch erfasst.

fmucar
quelle
Also sollte ich alle meine Textansichten und Bildschaltflächen im onPause? Null machen .
Ruchir Baronia
0

Sie können die Referenz mit entfernen null.

Angenommen, Sie haben Klasse A:

A a = new A();
a=null;

Die letzte Anweisung entfernt die Referenz des Objekts aund dieses Objekt wird von JVM "Müll gesammelt". Dies ist eine der einfachsten Möglichkeiten, dies zu tun.

Lakhan
quelle
Also sollte ich alle meine Textansichten und Bildschaltflächen im onPause? Null machen .
Ruchir Baronia
-3

Ja, Java ist Müll gesammelt, es wird den Speicher für Sie löschen.

Jake Kalstad
quelle
37
im am wenigsten erwarteten Moment
Matcheek
2
s / löschen / lecken / g
Mark K Cowan
-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}
user3124852
quelle
Der Grund, warum diese Antwort falsch ist, liegt darin, dass nur ein Verweis auf das Objekt und nicht auf das eigentliche Objekt entfernt wird.
Ben Morris
Der Grund, warum diese Antwort falsch ist, weil sie zeigt, wie Sie ein Objekt aus einer Liste entfernen können - dies war nicht die Frage.
Phil