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.

Merke: Konstruktoren werden nicht vererbt

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.

Merke: Konstruktoren werden verkettet
Beispiel 1: Impliziter Aufruf des parameterlosen Konstruktors der Oberklasse
img/Abb_10_11_ImpliziterAufrufStandardkonstruktor.svg
Abb. 10-11: Vereinsvorstand erweitert Vereinsmitglied (Beispiel 1)

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
img/Abb_10_12_ImpliziterAufrufStandardkonstruktorFehler.svg
Abb. 10-12: Vereinsvorstand erweitert Vereinsmitglied (Beispiel 2)

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.

Merke: Aufruf eines Kontstruktors der Oberklasse mit super()
Beispiel 3: Expliziter Aufruf eines Konstruktors der Oberklasse
img/Abb_10_13_ExpliziterAufrufKonstruktor.svg
Abb. 10-13: Vereinsvorstand erweitert Vereinsmitglied (Beispiel 3)

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.

JAVA
public class Vereinsvorstand extends Vereinsmitglied{

    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;
    }
    
}
Abb. 10-14: Oberklasse mit einem Konstruktor, der die Übergabe eines Strings erwartet (Quellcode)
Aufgabe

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.

img/Abb_10_15_UML_Mitarbeiter_Azubi.svg
Abb. 10-15: Klassen 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.

  1. Vervollständigen Sie das UML-Klassendiagramm entsprechend. Lösung
    img/Abb_10_16_UML_Mitarbeiter_Azubi.svg
    Abb. 10-16: Klassen Mitarbeiter und Auszubildender(UML)
  2. Erstellen Sie auf Grundlage des Klassendiagramms aus Teilaufgabe a) den Quellcode. Lösung
    JAVA
    public 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