3.8 Der Destruktor 

Ein Konstruktor wird aufgerufen, wenn das Objekt einer Klasse erzeugt wird. Damit beginnt der Lebenszyklus des Objekts, der in dem Moment endet, wenn das Pendant des Konstruktors aufgerufen wird: der Destruktor. Im Destruktor sind normalerweise Anweisungen enthalten, um die von einem Objekt beanspruchten Fremdressourcen freizugeben. Dazu gehören unter anderem Netzwerk- oder Datenbankverbindungen, die in einer objektinternen Referenz vorgehalten werden.
Ein konkretes Objekt wird dann aufgegeben,
- wenn der Gültigkeitsbereich der Objektvariablen verlassen wird oder
- wenn null an die Objektreferenz zugewiesen wird.
Das bedeutet jedoch nicht, dass beim Eintreten einer dieser beiden Bedingungen sofort der Destruktor ausgeführt wird. Tatsächlich kann das noch eine unbestimmbare Zeit dauern, da für diesen Vorgang der Garbage Collector verantwortlich ist, der normalerweise von der Laufzeitumgebung angestoßen wird. Mit anderen Worten bedeutet das aber auch, dass das Objekt zwar aus Sicht des Programms nicht mehr existiert, sich jedoch immer noch im Speicher befindet und diesen letztendlich belastet.
Ich möchte an dieser Stelle nicht die Aspekte und Hintergründe der Objektzerstörung und der damit verbundenen Garbage Collection erörtern. Dazu bedarf es noch weitergehender Kenntnisse in der Objektorientierung, insbesondere sind damit die Interfaces gemeint, die wir im nächsten Kapitel behandeln werden. Erst im Kontext der Interfaces werden alle Zusammenhänge klar.
Da wir uns in diesem Kapitel aber mit den allgemeinen Kriterien des Klassenkonzepts beschäftigen, sollte der Destruktor zumindest erwähnt werden. Für unsere Klasse Circle lautet er wie folgt:
~Circle() { ... }
Eingeleitet wird der Destruktor mit dem Tildezeichen, danach folgt der Klassenbezeichner mit dem obligatorischen runden Klammerpaar, dem sich der Anweisungsblock anschließt. Ein Destruktor enthält weder einen Zugriffsmodifizierer noch eine Parameterliste oder die Angabe eines Rückgabetyps.
Da ein Destruktor nicht aus dem Programmcode heraus direkt aufgerufen werden kann, soll hier diese Information genügen. Weitergehende Informationen rund um die Objektzerstörung erhalten Sie in Kapitel 4, »Vererbung, Polymorphie und Interfaces«.