dh-Materialien
Java Tutorial
 

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.

Vierecke 

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:

Klassenhierarchie 

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.

Abstrakte Methoden und Klassen

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).

Überschreiben von Methoden

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).

Finale Methoden, Attribute und Klassen

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.