====== Vererbung ======
Ist eine [[..:klasse:start|Klasse]] eine Erweiterung einer bereits bestehenden Klasse, so spricht man davon, dass diese Klasse von der anderen Klasse erbt. Die erste nennt man Subklasse (auch abgeleitete Klasse, Unterklasse, untergeordnete Klasse oder Kindklasse), die zweite Superklasse (auch Basisklasse, Oberklasse, übergeordnete Klasse oder Elternklasse).
Diese Vererbung schließt alles von der Superklasse ein, von der man erbt : [[..:datenfeld:start|Datenfelder]], [[..:konstruktor:start|Konstruktoren]] und [[..:methode:start|Methoden]]
Die Vererbung wird in Java durch das Schlüsselwort //extends// in der Signatur der Klasse defniert, z.B.:
public class Dalmatiner extends Hund
Man spricht hier auch von einer "Ist ein"-Beziehung. Im Beispiel kann man sagen: "Der Dalmatiner ist ein Hund".
Dabei kann es sich bei der Klasse, von der man erbt, sowohl um eine gewöhnliche als auch eine [[..:abstrakte_klasse:start|abstrakte Klasse]] handeln.
Wird bei der Definition einer Klasse das extends weggelassen, so erbt die Klasse automatisch von der Klasse //Object// und erbt damit beispielsweise die Methode //toString//. Dadurch exisitiert in Java eine Vererbungshierarchie, die mit Hilfe eines [[..:baumdiagramm:start|Baumdiagramms]] dargestellt werden kann mit der Klasse //Object// als Wurzel.
Im Gegensatz zu anderen objektorientierten Programmiersprachen kann eine Klasse nur von einer anderen Klasse direkt erben, eine sogenannte Mehrfachvererbung ist nicht möglich. Allerdings kann eine Klasse mehrere [[..:interface:start|Interfaces]] implementieren.
Überschreibt man eine Methode oder einen Konstuktor, so kann man mit dem Schlüssel //super// weiterhin auf das Element der Superklasse zugreifen, z.B.:
public class Dalmatiner extends Hund
{
private int punkte;
public Dalmatiner (int punkte)
{
super(); // eigentlich nicht nötig, da Java dies automatisch tut!!!
this.punkte = punkte;
}
public void fresse(int futter)
{
super.fresse(futter); // ruft die Methode fresse der Superklasse auf
this.punkte += punkte; // etwas sinnlos, nur ein Beispiel...
}
}
Bei einem Konstruktor kommt noch folgende Besonderheit dazu: Wird in der ersten Zeile nicht explizit ein Konstruktor aufgerufen, so ruft Java als erste Anweisung im Konstruktor die Zeile //super();// hinzu, ruft also den parameterlosen Konstruktor der Superklasse auf.