Vererbung
Abstrakte Methoden und Klassen
Überschreiben von Methoden
Finale Methoden, Attribute und Klassen
Ein Parallelogramm ist ein Trapez mit weiteren, spezielleren Eigenschaften. Die Klasse aller Parallelogramme ist somit eine Subklasse der Klasse aller Trapeze. Umgekehrt: Die Klasse aller Trapeze ist die Superklasse der Klasse aller Parallelogramme. Mit anderen Worten: Die Klasse aller Parallelogramme ist von der Klasse aller Trapeze abgeleitet.
Eine Raute ist ein Drachen, aber ebenfalls ein Parallelogramm. Ein Quadrat ist eine Raute, aber ebenfalls ein Rechteck. Das bedeutet: Sowohl die Klasse aller Quadrate als auch die Klasse aller Rauten sind zweifach abgeleitete Klassen. Derartige mehrfache Ableitungen sind in der Mathematik erlaubt, aber in Java verboten: Jede Klasse in Java hat immer nur eine einzige Superklasse, eine Superklasse kann dagegen mehrere Subklassen besitzen. Die Instanzen einer Subklasse erben sämtliche in ihrer Superklasse definierten Eigenschaften und Methoden. Es folgt ein (klitzekleiner) Auszug aus der Klassenhierarchie von Java:
Ist etwa MyPanel ein Objekt vom Typ JPanel, so gehört zu diesem Objekt beispielsweise die bereits in der Klasse JComponent deklarierte und implementierte Methode getWidth, die schon in der Klasse Container vorhandene Methode add (mit welcher Komponenten einem Container hinzugefügt werden können) und die Methode setSize, die jedem Objekt vom Typ Component zukommt.
Die in der Basisklasse Object definierten Methoden und Attribute gehören zu jedem Objekt, völlig unabhängig davon, welche Klasse durch dieses Objekt instanziiert wird.
Methoden, die in einer Klasse nur deklariert, jedoch nicht implementiert sind, heißen abstrakte Methoden. Diese werden mit dem Modifikator abstract gekennzeichnet:
abstract doSomething(typa a, typb b,...);
Enthält eine Klasse Example abstrakte Methoden, so muss auch diese Klasse mittels abstract deklariert werden:
abstract Example {
...
}
Werden in einer Subklasse einer abstrakten Klasse nicht sämtliche abstrakten Methoden implementiert, bleibt also mindestens eine der geerbten Methoden ohne Implementierung, so muss auch diese Subklasse als abstrakte Klasse deklariert werden.
Eine abstrakte Klasse kann nicht instanziiert werden, sondern muss abgeleitet werden.
Es gibt abstrakte Klassen, die keine abstrakten aber leere Methoden beinhalten:
abstract Example {
doABC() {}
doDEF() {}
...
}
Die Klasse MouseAdapter ist hierfür ein Beispiel (→ Javaprojekt DraggableShapes).
In jeder Klasse können von ihrer Superklasse geerbte Methoden neu implementiert werden, das heißt überschrieben (überschreiben = to override) werden, sofern diese nicht durch einschränkende Zugriffsmodifikatoren geschützt sind. Die überschriebenen Methoden der Super- bzw. der Subklasse müssen in jedem Fall in ihren Signaturen (Name der Methode, sowie Zahl und Typen ihrer Parameter) übereinstimmen.
Es ist empfehlenswert, die Implementationen überschriebener Methoden mit der vorangestellten Zeile
@Override
zu kennzeichnen (→ Javaprojekt MysteriousShapes).
Wird in einer Klasse eine von ihrer Superklasse geerbten Klassenmethode überschrieben und (natürlich ebenfalls) mit dem Schlüsselwort static als Klassenmethode deklariert, so wird damit die Klassenmethode der Superklasse versteckt (hiding a static method).
Eine mit dem Modifikator final gekennzeichnete Methode heißt finale Methode und kann nicht überschrieben werden. Mit final deklarierte Instanz- und Klassenvariablen heißen finale Attribute und können ebenfalls nicht überschrieben werden.
Methoden, die von einem Konstruktor aufgerufen werden, sollten grundsätzlich finale Methoden sein.
Von einer mit final gekennzeichneten Klasse kann es keine Subklasse geben. Beispielsweise sind die Klassen Math und System finale Klassen.