"Grundkurs Programmieren in Java - (7. Auflage, 2014)"
2001-2014, Carl Hanser Verlag

Lösungsvorschlag zu Aufgabe 9.14 (Version 3.0)

(c) 2001-2014 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:
  1. Der Konstruktor der Superklasse wird aufgerufen. Das wird rekursiv wiederholt, so dass der leere Rumpf des Object-Klassen-Konstruktors zuerst ausgeführt wird.
  2. Die Konstruktoren der Attribute werden in der Reihenfolge ihrer Deklaration aufgerufen.
  3. 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.)