In dieser Animation stellen wir den Ablauf der init()-Methode eines einfachen Applets im Objektdiagramm dar. Wir nennen das Applet Knopf, weil er nichts anderes enthält als ein Button-Objekt. Dieses wird in seiner init()-Methode erzeugt und mit add() dem Applet hinzugefügt.
Wenn wir ein Applet ausführen, erzeugt der Appletviewer ein Objekt davon und
ruft dafür seine init()-Methode auf, die
wir hier überschrieben haben. Darin vereinbaren wir eine lokale Variable
namens knopf, diese wird auf dem Stack
abgelegt. Dann erzeugen wir noch ein Objekt der Klasse
Button dieses wird auf dem Heap abgelegt
und seine Adresse in die knopf-Variable
geschrieben. Der Konstruktor von Button
bekommt einen String-Parameter, das ist die
Beschriftung des Knopfs – hier OK. Im Button-Objekt
gibt es eine Variable zu dem Zweck, dass der Konstruktor das erhaltene
String-Objekt darin speichert. Ihren Namen
würden wir nur dann kennen, wenn wir den Text der Klasse
Button studieren würden – im Moment brauchen
wir das nicht. Damit haben wir die erste Anweisung der
init()-Methode abgearbeitet.
Die nächste Anweisung ist der Aufruf der add()-Methode.
Diese stammt aus der Oberklasse; genauer genommen aus deren Oberklasse
Container. Das bedeutet, dass sie unser
Knopf-Objekt verändert. Ihre Aufgabe ist,
ihren erhaltenen Parameter – hier die Adresse des
Button-Objekts, die wir in der Variable knopf
gespeichert haben – im Knopf-Objekt zu
speichern. Zu diesem Zweck gibt es dort irgendwelche Variable, die wir nicht
kennen, weil wir den Text der Klasse Container
nicht untersucht haben. Wir brauchen das nicht, wir wissen nur, dass
add() den Inhalt ihrer Parametervariable
dorthin hineinkopiert. Dieser Inhalt ist die Adresse unseres
Button-Objekts. Nach der Ausführung der
add()-Methode referenziert sie also dieses
Objekt.
Nun ist die init()-Methode fertig; ihre lokalen Variablen – hier nur knopf – werden vom Stack abgeräumt.
Hätten wir das Button-Objekt nicht
mit add() beim Applet registriert, würde auch
dieses Objekt vom Heap verschwinden – die automatische Speicherbereinigung würde
es löschen. Weil aber diese Verbindung hier besteht, bleibt die erzeugte
Struktur nach init() bestehen und das Button
kann später (z.B. in der paint()-Methode)
verändert, oder durch Drücken aktiviert werden – das haben wir in diesem
Programm nicht getan. Der Sinn war nur zu illustrieren, wie so ein Ablauf im
Objektdiagramm dargestellt werden kann.
public class Knopf extends JApplet { public void init() { JButton knopf = new JButton("OK"); Container c = super.getContentPane(); c.add(knopf); Lauscher lauscher = new Lauscher(); knopf.addActionListener(lauscher); } } class Lauscher implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Knopf gedrückt"); } }