Literatur

Vererbung

Bei einer Vererbung in Java wird zwischen einer Super- und einer Subklasse unterschieden. Die Superklasse, auch Eltern- oder Basisklasse genannt, ist in der Regel eine Zusammenfassung von allgemeinen Attributen und Methoden unterschiedlicher aber ähnlicher Objekte.

Die Subklasse, auch Kindsklasse bezeichnet, bekommt von ihrer Superklasse sämtliche Attribute und Methoden vererbt. Desweiteren wird die Subklasse um eigene Attribute und Methoden erweitert. Man spricht hier von einer Spezialisierung der Subklasse von der Superklasse.

Eine Vererbung in Java findet über das Schlüsselwort extends statt. Schauen wir uns dazu erst einmal die allgemeine Form an.

Modifikator class Subklasse extends Superklasse {

Der Modifikator kann Werte wie public, abstract oder andere Zugriffsmodifikatoren annehmen. Die Subklasse bezeichnet hier die Klasse, die etwas vererbt bekommt. Anschließend folgt das Schlüsselwort extends, welches die Vererbung der Superklasse einleitet. Die Superklasse zeigt anschließend an, von welcher Klasse etwas vererbt werden soll.

In Java gibt es keine Mehrfachvererbung. Von Klassen, die mit dem Keyword  final deklariert sind, können keine Kindsklassen abgeleitet werden. Eine Superklasse kennt Ihre Subklassen nicht.

Ein Superklasse, die nicht vollständig implementiert ist, wird mit dem Schlüsselwort abstract gekennzeichnet. Aus Klassen, die mit abstract gekennzeichnet sind, können jedoch keine Objekte erzeugt werden. Subklassen, die von einer abstrakten Superklasse ihre Attribute und Methoden vererbt bekommen, müssen die mit abstract gekennzeichneten Methoden implementieren. Geschieht dies nicht, so ist die Subklasse zwangläufig ebenfalls mit abstract zu kennzeichnen.

Die Subklasse bekommt sowohl alle Attribute als auch Methoden, die in der Superklasse mit dem Schlüsselwort public protected oder keinem versehen sind, vererbt. Alle Attribute und Methoden der Superklasse, die mit dem Schlüsselwort private gekennzeichnet sind, werden nicht vererbt. Die vererbten Methoden der Superklasse können auch in der Subklasse überladen oder sogar ersetzt (überschrieben) werden. Beim Überschreiben von Methoden kann auch der Sichtbarkeitsmodifikator verändert werden, aber nur von gar keinem Modifikator zu protected oder public bzw. von protected zu public. Hier gilt die Regel: Das Attribut bzw. Methode darf nicht 'privater' sein als in der Superklasse.

In der Subklasse können auch explizit die Methoden der Superklasse aufgerufen werden, dafür gibt es das Schlüsselwort super.

Kommen wir nun zu einem konkreten Beispiel:

public class Kugelschreiber extends Stift {


Bei diesem Beispiel bekommt die Klasse Kugelschreiber alle zugänglichen Attribute der Klasse Stift vererbt. So schauen wir uns dazu einmal ein Klassendiagramm in der Unified Modelling Language (UML) an.

uml,Vererbung,Klassendiagramm


In dem Bild zeigen die Pfeile der Subklassen auf die Superklasse. Dadurch wird noch einmal verdeutlicht, dass die Superklasse nicht Ihre Subklassen kennt, sondern nur die Kindsklasse ihre Elternklasse.

Damit eine Typumwandlung gefahrlos möglich ist, gibt es den instanceof-Operator. Anhand dieses Operators kann ermittelt werden, von welcher Klasse ein Objekt erstellt worden ist. Der instanceof-Operator gibt nur true oder false zurück, da er nur überprüft, ob ein Objekt von einer Klasse erzeugt wurde.

Sehen wir uns nun einmal die formale Syntax an:

objekt instanceof Klassenname

Subklassen sind automatisch immer auch eine Instanz von der Superklasse (jedoch nicht umgekehrt!).

Schauen wir uns zur Veranschaulichung noch ein Beispiel an. Bitte überlegen Sie erst Ihre Antwort und lösen Sie anschließend das Ergebnis auf..

Beispiel:

/* Die Klassen Grossvater, Vater und Sohn sollen hier nur zur Veranschaulichung dienen */
class Grossvater { ... }
class Vater extends Grossvater{ ... }
class Sohn extends Vater { ... }
// Hier wird jeweils ein Objekt der oben aufgeführten Klassen erzeugt.
Object refA = new Grossvater();
Object refB = new Vater();
Object refC = new Sohn();
// Ausgabe des Rückgabewertes des instanceof-Operators
System.out.println(""+refA instanceof Grossvater);
System.out.println(""+refB instanceof Grossvater);
System.out.println(""+refC instanceof Grossvater);



Dieses Beispiel dient einzig und allein zur Verdeutlichung des oben beschriebenen Sachverhaltes. Aus der Sicht eines Softwareentwicklers macht diese Vererbung eher weniger Sinn. Man würde dort eher eine Klasse Person machen und Grossvater, Vater und Sohn wären Objekte der Klasse Person.


Unterthemen: