Vererbung

weiter: Ansammlungen von Klassen
zurück: Konstruktoren
Inhaltsverzeichnis

Das Erzeugen neuer Klassen

OOP ist eine Art, Code zu verpacken und zu verstecken: beim Programmieren braucht man nur die Methoden der Objekte zu kennen: Stichwort Message Passing. OOP besitzt ausserdem ein Verfahren zum Erzeugen neuer Programme, das heisst hier: zum Erzeugen neuer Klassen aus alten Klassen, und zwar nicht durch Hin und Herkopieren von Programm-Code - der soll ja gerade versteckt werden -, sondern durch einen amtlichen Mechanismus, durch Vererbung. Das Erzeugen einer neuen Klasse durch Vererbung bezeichnet man auch als Ableiten einer neuen Klasse.

Neue Klassen können also von vorhandenen Klassen abgeleitet werden. Die abgeleitete Klasse erbt von ihrer Superklasse alle public-, jedoch keine private- Eigenschaften und -Methoden. Für den Fall, dass man Eigenschaften vererben will, die gegenüber fremden Klassen private sind und trotzdem vererbt werden, gibt es das Schlüsselwort protected, siehe Beispiel.

Konstruktoren werden nicht vererbt. Die abgeleitete Klasse hat aber wie immer ihren Standard-Konstruktor.

Die Erzeugung einer abgeleiteten Klasse erfolgt mit dem Schlüsselwort extends.

Beispiel: Eine Superklasse:

public class SuperKlasse{

    public void meldung(){

       System.out.println( "Hier meldet sich eine Methode der Superklasse" );
    }
}
Davon abgeleitet eine Subklasse:
public class SubKlasse extends SuperKlasse{

    public static void main( String [] args ){

        SubKlasse subklassenobjekt = new SubKlasse();
        subklassenobjekt.meldung();
    }
}
Wie man sieht, kann das Objekt subklassenobjekt die Methode meldung() ausführen, obwohl diese Methode in der Klasse selbst nicht definiert ist; diese Methode wurde von der Superklasse vererbt, weil sie public ist.

Übung:

Man schreibe eine Subklasse zur Subklasse und teste, ob die Methode weitervererbt wurde. Es geht folgendermassen los:
public class UnterSubKlasse extends SubKlasse

Hierarchie der Klassen

Es ergibt sich also eine Hierarchie von Klassen. Unter inhaltlichen Gesichtspunkten gilt: Je weiter oben eine Klasse in der Hierarchie steht, umso allgemeiner sollte sie sein, nach unten werden die Klassen inhaltlich immer stärker spezialisiert.

Die Vererbung stellt eine Möglichkeit dar, einmal geschriebene Klassen wieder zu verwenden und in der abgeleiteten Klasse nach Bedarf zu modifizieren, anstatt eine ganz neue Klasse schreiben zu müssen. Inhaltlich gesehen sollte die Vererbung dem Programmierer helfen, sein Programm deutlich zu strukturieren: Vom Allgemeinen zum Besonderen.

Unabhängig davon, ob eine Klasse durch Vererbung erzeugt wurde oder nicht, kann man von ihr Instanzen bilden durch Aufruf des Konstruktors.

Im folgenden wird als Beispiel eine Hierarchie von Klassen erzeugt:

Datei Fahrzeug.java

Übung:

Man teste die Klasse Fahrzeug ,insbesondere die Methode beschleunigen(). Man beschleunige mehrmals!

Die Klasse Fahrzeug dient im Folgenden als Superklasse für eine Klasse Pkw, die alle Eigenschaften und Methoden von Fahrzeug erbt, sofern sie public sind. Beachte: Es ist vorgeschrieben, dass die Konstruktoren der abgeleiteten Klasse als erstes den Konstruktor ihrer Superklasse aufrufen mit dem Schlüsselwort super() Das funktioniert natürlich nur, wenn der aufgerufene Konstruktor bei der Super-Klasse auch wirklich existiert.

Datei Pkw.java

Übung:

Man teste die Klasse Pkw Man beachte, dass ein Pkw beschleunigen kann, obwohl die Definition für beschleunigen() in der Datei selbst gar nicht vorhanden ist. Man beschleunige mehrmals!

Übung:

Man erweitere die Klasse Pkw indem man in die Datei neue Eigenschaften und Methoden hineinschreibt. Die Klasse kann dann alles

Weiteres Beispiel: Von der Klasse Pkw wird nun eine Klasse Sportwagen abgeleitet. Diese erbt von Pkw und damit indirekt von Fahrzeug

Datei Sportwagen.java

Übung:

Man teste die Klasse Sportwagen

Überschreiben von Methoden

Wie man beim Testen bemerkt hat, verhält sich die Methode beschleunigen() bei Sportwagen-Objekten anders als bei den anderen Objekten. Die Methode wurde nämlich in der Sportwagen-Datei neu definiert, obwohl sie vererbt wird; dieses Umdefinieren nennt man Überschreiben: Eine geerbte Methode in einer abgeleiteten Klasse neu definieren.

Übung:

Man schreibe eine von Sportwagen abgeleitete Klasse und überprüfe, wie sich die Methode beschleunigen() dort verhält.

Übung:

Man schreibe ausgehend von Konto folgende abgeleitete Klassen: BankKonto und GiroKonto

Die Vererbung läuft von oben nach unten

Wenn von einer Klasse eine andere Klasse durch Vererbung abgeleitet wird, dann bemerkt die Super-Klasse davon nichts. Insbesondere wenn die abgeleitete Klasse durch Überschreiben geerbte Methoden modifiziert, dann bleiben die Methoden der Super-Klasse davon unberührt.


www.AndreasGoedel.de