Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
was meinst du mit "es gibt keine ordentlichen Konstruktoren". Aber ich vermute mal du meinst Destruktoren.
Falls ja, explizite Destruktoren sind deshalb nicht nötig, weil es die Garbage Collection (GC) gibt. Die GC sogt dafür, dass alle nicht mehr erreichbaren Objekte freigegeben werden. Das im Zusammenspiel mit der Sichtbarkeit von Objekte sorgt dafür, dass du die Objekte nicht mehr expliziz löschen mußt.
Hi,
mal ganz kurz ein wenig zur Theorie, es gibt ordentliche Destruktoren. Diese werden natürlich auch aufgerufen, nur geschieht das ganze implizit, nicht explizit. Hierin liegt auch die Begründung warum man von ordentlich sprechen kann, denn es werden zwei Dinge sichergestellt
Der Destruktor wird immer aufgerufen
Der Destruktor gibt immer allen allozierten Speicher frei
In Sprachen mit explizitem Aufruf, in denen man den Destruktor zudem häufig mal selber schreiben darf, wird Beides nicht sichergestellt und führt gerne mal zu Speicherleaks.
Zudem kannst du natürlich deiner Variable (die nur ein Objektreferenz darstellt) den null-Pointer zuweisen. War dies die letzte Referenz auf das entsprechende Objekt, wird der GC auch (wie hier schon gesagt) irgendwann aufräumen. Den kannst du zudem auch synchron aufrufen (also sofort zum Aufräumen veranlassen und auf Rückkehr warten), von sich aus macht er es halt asynchron.
Den kannst du zudem auch synchron aufrufen (also sofort zum Aufräumen veranlassen und auf Rückkehr warten), von sich aus macht er es halt asynchron.
Gruß Der Unwissende
Soweit ich weiß ist trotzdem bei einem synchronen Aufruf nicht sichergestellt, dass sofort aufgeräumt wird, deshalb ist dies eigentlich nicht notwendig.
Nein, dass kann man nicht. Der Aufruf von System.gc(); kann auch einfach nichts bewirken, es ist kein Muss, dass dann der Garbage Collector tatsächlich aufgerufen wird. Die VM kann diesen Aufruf auch einfach ignorieren.
Seit wann soll das denn so sein? Und wozu?
Korrigiert mich bitte wenn ich mich irre (dann könnte ich vielleicht den o.g. Nick übernehmen), aber meines Wissens gibt es keine Destruktoren, weil sie auch niemand braucht - auch der GC nicht. Der gibt nämlich einfach nur allen Speicher frei, auf den niemand mehr zeigt und a Ruh is'. Genauer gesagt kopiert er alles, was noch referenziert wird in einen neuen Speicherbereich um und gibt den alten komplett frei. Dadurch wird nämlich auch verhindert, dass er etwas "vergisst".
Im Gegensatz zu C++ mit einer manuellen Freigabe ist in Java keine Aussage über den Zeitpunkt möglich, zu dem die Routine aufgerufen wird – dies ist von der Implementierung des GCs abhängig. Es kann sein, dass finalize() überhaupt nicht aufgerufen wird, und zwar dann, wenn die VM Fantastillionen Megabyte Speicher hat und dann beendet wird; sie wird den Heap-Speicher als Ganzes dem Betriebssystem zurückgeben.
finalize() ist kein Destruktor :!: Es ist eine Methode die zum Aufräumen gedacht ist, nicht zum Zerstören. Mal ganz abgesehen davon, dass die Tatsache, dass sie nicht mit Sicherheit aufgerufen wird, sie ziemlich überflüssig macht.