Ober- und Unterklasse
- Vererbung:eine „ist ein“-Beziehung — ein Buch ist ein Medium.
- Oberklasse:enthält, was alle gemeinsam haben (Generalisierung).
- Unterklasse:erbt alle Attribute und Methoden der Oberklasse und ergänzt eigene (Spezialisierung).
- Notation:Linie mit hohlem Dreieck an der Oberklasse; Geerbtes steht nur in der Oberklasse.
- Sichtbarkeit:
-private Attribute der Oberklasse erreicht die Unterklasse nur über Methoden;#(protected) erlaubt den direkten Zugriff. - Java:
public class Buch extends Medium— genau eine Oberklasse.
Buch und DVD sind noch getrennt modelliert. Ziehe jede Zeile, die beide Klassen haben, nach oben in die Oberklasse Medium — mit der Tastatur: Zeile fokussieren, ↑ oder Enter schiebt sie hoch, ↓ holt sie zurück.
Halte fest: In die Oberklasse gehört nur, was alle Unterklassen haben. Eine Methode, die in jeder Unterklasse anders arbeitet, steht trotzdem oben — die Unterklassen überschreiben sie.
super, Überschreiben, Polymorphie
- Konstruktor:erste Anweisung ist
super(titel, jahr);— die Oberklasse setzt ihre Attribute selbst. - Überschreiben:gleicher Methodenkopf in der Unterklasse ersetzt die geerbte Methode;
@Overridelässt den Compiler das prüfen. super.getInfo():ruft die Version der Oberklasse auf — die Unterklasse ergänzt nur ihren Teil.- Polymorphie:eine Variable vom Typ der Oberklasse darf auf ein Unterklassen-Objekt zeigen:
Medium m = new Buch(…); - Dynamische Bindung:welche Methode läuft, entscheidet das Objekt, nicht der Typ der Variable.
- - titel: Zeichenkette
- - jahr: Ganzzahl
- c Medium(titel: Zeichenkette, jahr: Ganzzahl)
- + getTitel(): Zeichenkette
- + getInfo(): Zeichenkette
- - autor: Zeichenkette
- c Buch(titel: Zeichenkette, jahr: Ganzzahl, autor: Zeichenkette)
- + getInfo(): Zeichenkette
- - laufzeit: Ganzzahl
- c DVD(titel: Zeichenkette, jahr: Ganzzahl, laufzeit: Ganzzahl)
- + getInfo(): Zeichenkette
getInfo() steht in allen drei Klassen: oben die allgemeine Fassung, unten die überschreibenden.
Herleitung:
Medium m = new Buch("Momo", 1973, "Ende");m sind nur Methoden aufrufbar, die Medium kennt.m.getInfo()Buch, also läuft Buch.getInfo().super.getInfo() + ", " + autorMedium.getInfo() liefert "Momo (1973)", dann wird der Autor angehängt."Momo (1973), Ende"public class Buch extends Medium {
private String autor;
public Buch(String titel, int jahr, String autor) {
super(titel, jahr); // zuerst die Oberklasse
this.autor = autor;
}
@Override
public String getInfo() {
return super.getInfo() + ", " + autor;
}
}
Medium[] regal = new Medium[3];
regal[0] = new Buch("Momo", 1973, "Ende");
regal[1] = new DVD("Paddington", 2014, 95);
regal[2] = new Medium("Stadtplan", 2021);
for (int i = 0; i < regal.length; i++) {
System.out.println(regal[i].getInfo());
}
// Momo (1973), Ende
// Paddington (2014), 95 min
// Stadtplan (2021)
Vererbung: class Unter extends Ober — die Unterklasse erbt alles, ruft im Konstruktor zuerst super(…) auf und darf Methoden überschreiben. Beim Aufruf zählt der Typ des Objekts, nicht der Variable.
Allgemeine Hinweise
super zuerst
super(…) muss die erste Anweisung im Konstruktor sein. Fehlt er und hat die Oberklasse keinen Konstruktor ohne Parameter, übersetzt der Compiler die Unterklasse nicht.
private bleibt privat
In Buch führt return titel; zu einem Übersetzungsfehler, wenn titel in Medium privat ist. Nimm den Getter oder deklariere das Attribut mit # (protected).
Der ist-ein-Test
Vererbung nur, wenn der Satz „B ist ein A“ stimmt. Passt nur „A hat ein B“, ist es eine Assoziation — ein Auto ist kein Motor.
