Leben und Sterben eines Objekts - beim O'Reilly Verlag
Leben und Sterben eines Objekts - beim O'Reilly Verlag
Leben und Sterben eines Objekts - beim O'Reilly Verlag
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Konstruktoren <strong>und</strong> GC<br />
Objekt-Killer Nr. 1<br />
Die Referenz verliert<br />
dauerhaft ihre<br />
Geltung.<br />
public class StackRef {<br />
public void foof() {<br />
barf();<br />
}<br />
public void barf() {<br />
Ente e = new Ente();<br />
}<br />
}<br />
Mir gefällt nicht,<br />
worauf das hinausläuft.<br />
1<br />
2<br />
foof() wird auf den Stack<br />
geschoben. Keine Variablen<br />
sind deklariert.<br />
barf() wird auf den Stack<br />
geschoben. Dort deklariert<br />
es eine Referenzvariable<br />
<strong>und</strong> erzeugt ein neues<br />
Objekt, das dieser Referenz<br />
zugewiesen wird. Das<br />
Objekt wird auf dem Heap<br />
erzeugt, <strong>und</strong> die Referenz<br />
lebt <strong>und</strong> ist in Geltung.<br />
foof()<br />
barf()<br />
foof()<br />
e<br />
Heap<br />
Ente-Objekt<br />
Die neue Ente kommt auf den<br />
Heap, <strong>und</strong> solange barf() läuft,<br />
lebt die Referenz »e« <strong>und</strong> ist<br />
gültig. Die Ente wird also als<br />
lebend betrachtet.<br />
3<br />
barf() ist beendet <strong>und</strong> wird<br />
vom Stack genommen.<br />
Der Stack-Frame wird aufgelöst,<br />
<strong>und</strong> »e« ist jetzt tot<br />
<strong>und</strong> weg. Die Ausführung<br />
kehrt zu foof() zurück,<br />
aber foof() kann »e« nicht<br />
verwenden.<br />
e<br />
foof()<br />
Heap<br />
Ente-Objekt<br />
Oje! Als der Stack-Frame<br />
für barf() vom Stack geblasen<br />
wurde, ging die Variable »e«,<br />
<strong>und</strong> damit wurde die Ente<br />
aufgegeben. Garbage Collector-Futter.<br />
Sie sind hier 261