"Grundkurs Programmieren in Java - (5. Auflage, 2010)"
2001-2010, Carl Hanser Verlag
Lösungsvorschlag zu Aufgabe 9.14 (Version 3.0)
(c) 2001-2010 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
a)
Programmausgabe:
E:\hiwi\temp>java Sandwich
Mahlzeit()
Mittagessen()
Vesper()
Brot()
Wurst()
Salat()
Sandwich()
Quelltext: Sandwich.java (alle Klassen in einer Datei)
b)
Allgemeine Reihenfolge des Konstruktor-Aufrufs:
- Der Konstruktor der Superklasse wird aufgerufen. Das wird rekursiv
wiederholt, so dass der leere Rumpf des Object-Klassen-Konstruktors
zuerst ausgeführt wird.
- Die Konstruktoren der Attribute werden in der Reihenfolge ihrer
Deklaration aufgerufen.
- Der Rumpf des Konstruktors der abgeleiteten Klasse wird ausgeführt
(dort dann wieder Schritt 2 und 3, falls entsprechende Attribute vorhanden
sind, bzw. eine abgeleitete Klasse existiert).
Begründung:
Wenn man ein Objekt einer abgeleiteten Klasse A instantiiert,
dann muss man natürlich auf die Attribute (protected/private) der Superklasse(n)
zugreifen können. Innerhalb des Konstruktors der Klasse A müssen also
die Attribute (insofern Sie instantiiert werden können) der Superklasse
instantiiert sein, bevor der Körper des Konstruktors ausgeführt wird. Das muss
für alle Klassen in der Hierarchie gelten. Daher muss zunächst der Konstruktor
der Wurzelklasse (Object) aufgerufen werden, und dessen Attribute
instantiiert werden. Jetzt kann die von Object abgeleitete Klasse die
entsprechenden Attribute verwenden. Der Konstruktor der von Object
abgeleiteten Klasse wird ausgeführt und wieder die Attribute instantiiert,
usw. (Beim Instantiieren der Attribute wird natürlich genau auf die gleiche
Weise vorgegangen.)