10.4 Konstruktoren werden nicht vererbt
Eine Unterklasse erbt zwar die Methoden ihrer Oberklasse, nicht jedoch deren Konstruktoren. Wird im Quellcode der Unterklasse kein Konstruktor erstellt, erhält diese – wie jede andere Klasse – automatisch einen parameterlosen Konstruktor.
Jeder Konstruktor ruft automatisch den Standard-Konstruktor (parameterlos) seiner Oberklasse auf. Erst danach führt er die Anweisungen aus, die er selbst enthält.
Besitzt die Oberklasse keinen parameterlosen Konstruktor führt dies zu einer Fehlermeldung.
Beispiel 1: Impliziter Aufruf des parameterlosen Konstruktors der Oberklasse
In der Klasse Vereinsvorstand ist kein Konstruktor definiert. Daher erhält die Klasse automatisch einen parameterlosen Konstruktor. Dieser ruft automatisch den parameterlosen seiner Oberklasse Vereinsmitglied auf.
Beispiel 2: Impliziter Aufruf eines nicht vorhandenen parameterlosen Konstruktors der Oberklasse
In der Klasse Vereinsvorstand ist kein Konstruktor definiert. Daher erhält die Klasse automatisch einen parameterlosen Konstruktor. Dieser ruft automatisch den parameterlosen seiner Oberklasse Vereinsmitglied auf.
In der Klasse Vereinsmitglied existiert jedoch kein parameterloser Konstruktor. Daher führt der Versuch diesen aufzurufen zu einer Fehlermeldung.
Sieht ein Konstruktor als erste Anweisung explizit den Aufruf eines bestimmten Konstruktors seiner Oberklasse vor, entfällt der automatische Aufruf des Standard-Konstruktors seiner Oberklasse.
Mit Hilfe der Anweisung super()1 kann der Standardkonstruktor der Oberklasse aufgerufen werden. Soll stattdessen ein Konstruktor der Oberklasse aufgerufen werden, der bestimmte Parameter erwartet, müssen diese wie bei jeder Methode innerhalb des Klammerpaares übergeben werden.
super()Beispiel 3: Expliziter Aufruf eines Konstruktors der Oberklasse
In der Klasse Vereinsvorstand wird zum einen ein parameterloser Konstruktor definiert und zum anderen ein Konstruktor, der die Übergabe zweier Strings erwartet.
Der parameterlose Konstruktor ruft mit Hilfe der Anweisung super() den parameterlosen seiner Oberklasse Vereinsmitglied auf. Würde diese Anweisung nicht explizit angegeben, würde sie dennoch automatisch ausgeführt werden.
Der Konstruktor, der die Übergabe zweier Strings erwartet, ruft mit Hilfe der Anweisung super(pVorname, pNachname) den entsprechenden Konstruktor seiner Oberklasse Vereinsmitglied auf. Würde diese Anweisung nicht explizit angegeben, würde statt dessen automatisch der parameterlose Konstruktor der Oberklasse aufgerufen werden.
private String aufgabe;
public Vereinsvorstand() {
super();
}
public Vereinsvorstand(String pVorname, String pNachname) {
super(pVorname, pNachname);
}
public String getAufgabe() {
return aufgabe;
}
public void setAufgabe(String pAufgabe) {
this.aufgabe = pAufgabe;
}
}
Aufgabe 10-5: Mitarbeiter und Auszubildende
Ein Unternehmen möchte für seine Auszubildenden zusätzlich zu den Daten, die es bereits für alle Mitarbeiter erfasst, die Bezeichnung des jeweiligen Ausbildungsberufs speichern.
UML-Klassenmodell und Quellcode der Klasse Mitarbeiter liegen bereits vor.
Mitarbeiter (UML)
Die Klasse Mitarbeiter verfügt neben einem paramterlosen Konstruktor auch über einen Konstruktor, der die Übergabe des Vornamens und Nachnamens erwartet. Die Möglichkeiten, die dies eröffnet, sollen auch für Auszubildende gegeben sein.
-
Vervollständigen Sie das UML-Klassendiagramm entsprechend.
Lösung
Abb. 10-16: Klassen MitarbeiterundAuszubildender(UML) -
Erstellen Sie auf Grundlage des Klassendiagramms aus Teilaufgabe a) den Quellcode.
Lösung
JAVApublic class Auszubildender extends Mitarbeiter {
private String ausbildungsberuf;
public Auszubildender() {
super();
}
public Auszubildender(String pVorname, String pNachname) {
super(pVorname, pNachname);
}
public String getAusbildungsberuf() {
return ausbildungsberuf;
}
public void setAusbildungsberuf(String pAusbildungsberuf) {
this.ausbildungsberuf = pAusbildungsberuf;
}
}Abb. 10-17: Quellcode der Klasse Auszubildender