Vererbung
Bei der Modellierung von Klassen stellt man häufig fest, dass sich einige Klassen der Struktur und dem Verhalten nach ähneln. In solchen Fällen hat man die Möglichkeit, die gemeinsamen Strukturen und Verhaltensweisen aus den speziellen Klassen zu extrahieren und in einer allgemeineren Klasse unterzubringen. Dies wird als Generalisierung bezeichnet. Umgekehrt gibt es oftmals auch Bedarf, eine bestehende Klasse um zusätzliche Attribute und/oder Methoden zu erweitern. Dies bezeichnet man als Spezialisierung Die Beziehung zwischen einer speziellen Klasse und einer allgemeinen Klasse wird Vererbung bezeichnet. Die speziellen Klasse einer Vererbung werden als Unterklassen (Sub Classes), die allgemeinen Klassen als Oberklassen (Super Classes) bezeichnet.
Implementieren von Vererbung
Die Vererbung wird mit dem Schlüsselwort extends
realisiert. In der Oberklasse
können Attribute und Methoden mit dem Schlüsselwort protected
als geschützt
festlegt werden. Unterklassen können auf alle öffentlichen und geschützten
Attribute und Methoden der Oberklasse zugreifen.
- Oberklasse
- Unterklasse
public class Computer {
...
protected CPU cpu;
protected int memoryInGB;
public Computer(String description, CPU cpu, int memoryInGB) {
this.description = description;
this.cpu = cpu;
this.memoryInGB = memoryInGB;
}
...
}
public class Notebook extends Computer {
private final double screenSizeInInches;
public Notebook(String description, CPU cpu, int memoryInGB, double screenSizeInInches) {
super(description, cpu, mainMemoryInGB);
this.screenSizeInInches = screenSizeInInches;
}
public double getScreenSizeInInches() {
return screenSizeInInches;
}
}
In den Konstruktoren der Unterklasse muss ein Konstruktor der Oberklasse mit
Hilfe von super
aufgerufen werden.
Überschreiben von Methoden
Wird in einer Unterklasse eine Methode definiert, die der Signatur einer Methode
der Oberklasse entspricht, wird die Methode der Oberklasse überschrieben, d.h.
von der Unterklasse neu implementiert. Bei Bedarf kann die ursprüngliche
Methodenimplementierung der Oberklasse mit Hilfe der Objektreferenz super
aufgerufen werden.
- Oberklasse
- Unterklasse
public class Computer {
...
public ArrayList<String> getSpecification() {
ArrayList<String> specification = new ArrayList<>();
specification.add("description: " + description);
specification.add("cpu: " + cpu);
specification.add("memoryInGB: " + memoryInGB);
return specification;
}
...
}
public class Notebook extends Computer {
...
@Override
public ArrayList<String> getSpecification() {
ArrayList<String> specification = super.getSpecification();
specification.add("screenSizeInInches: " + screenSizeInInches);
return specification;
}
...
}
Die Annotation @Override
sorgt bei fehlerhaftem Überschreiben der Methode für
entsprechende Kompilierungsfehler.