Vererbung in Java – Ableiten einer Klassen

In Java können mit Hilfe der Vererbung Programmteile wiederverwendet werden, dabei werden die Merkmale bereits vorhandener Klassen auf abgeleitete Klassen übertragen.

Das Konzept der Vererbung ist in Java auf Einfachvererbung begrenzt, das heißt eine neue Klasse kann maximal von einer anderen Klasse abgeleitet werden. Andere objektorientierte Programmiersprachen verfügen über die Möglichkeit der Mehrfachvererbung, bei der eine Klasse von mehreren Klassen abgeleitet werden kann.

Da dies aber auch Probleme mit sich bringt, wurde in Java nur die Einfachvererbung implementiert.

Es gibt in Java aber durchaus das Konzept der Mehrfachvererbung. Und zwar wurde mit Hilfe der Interfaces eine restriktive Art der Mehrfachvererbung geschaffen.

Vererbung der Klassenmerkmale durch Ableiten einer Klasse

Das Ableiten einer Klasse von einer Vaterklasse, oft auch als Basisklasse bezeichnet, ist sehr einfach. Es muss dazu nur das Schlüsselwort extends gefolgt von dem Namen der Vaterklasse im Kopf der Klasse angegeben werden.

Die neue Klasse erbt dadurch alle Merkmale der Basisklasse. Dabei werden alle Klassenvariablen und Methoden der Klasse an die abgeleitete Klasse übertragen. Achtung! Konstruktoren werden nicht vererbt.

plhq_teaser_hbox_gelb_fotolia_RA Studio_46292813

Unser großes
Android Online-Kurs
Gesamtpaket



Weitere Infos

In der abgeleiteten Klasse können neue Variablen deklariert und weitere Methoden definiert werden. Zusätzlich können die geerbten Variablen und Methoden überlagert werden. Das Konzept der Methodenüberlagerung ist in Java von großer Bedeutung und wird weiter unten in diesem Beitrag zusammen mit der dynamischen Methodensuche ausführlich behandelt.

In dem folgenden Code-Beispiel wird die Klasse Säugetier von der Basisklasse Lebewesen abgeleitet. Dadurch erbt die Säugetier-Klasse die Merkmale der Basisklasse. Wir testen die Anwendung mittels der Klasse Vererbungstest. Es ist zu beachten, dass die Klasse Vererbungstest die inneren Klassen Säugetier und Lebewesen enthält.

Beispielanwendung für die Vererbung in Java

/*
* Beispielanwendung für die Vererbung in Java
*/

public class Vererbungstest
{
  public static void main (String[] args)
  {
     Lebewesen tier1 = new Säugetier();
     tier1.alter = 5;     
     System.out.println("\nTier 1\nAlter   :  " + tier1.getAlter() + " Jahre");

     Säugetier tier2 = new Säugetier();
     tier2.alter = 5;
     tier2.tragzeit = 22;     
     System.out.println("\nTier 2\nAlter   :  " + tier2.getAlter() + " Jahre");
     System.out.println("Tragzeit: " + tier2.getTragzeit() + " Wochen");
  }
}

class Lebewesen
{
  short alter;

  short getAlter()
  {
    return this.alter;
  }
}

class Säugetier extends Lebewesen
{
  short tragzeit;

  short getTragzeit()
  {
    return this.tragzeit;
  }
}

In Zeile 9 wird zunächst ein Objekt vom Typ Säugetier instanziert und anschließend der Objektvariable tier1 vom Typ Lebewesen zugewiesen. In Zeile 13 wird ein Objekt vom Typ Säugetier instanziert und der Objektvariable tier2 vom Typ Säugetier zugewiesen.

Dies ist möglich, da eine Objektvariable auch Objekte aufnehmen kann, die von einem anderen Datentyp sind. Dieses Konzept nennt man Polymorphismus (Vielgestaltigkeit). Die Objektvariable tier ist dabei vom Datentyp der Basisklasse Lebewesen. Sie kann nicht jedes beliebige Objekt aufnehmen, sondern nur Objekte, die Instanzen einer von der Basisklasse Lebewesen abgeleiteten Klasse sind.

Die Flexibilität wird durch den Java-Compiler ermöglicht, indem dieser sicherstellt, dass nur auf die Eigenschaften der Klasse der Objektvariable zugegriffen werden kann. Denn diese Eigenschaften sind aufgrund der Vererbungshierarchie in jedem zuweisbaren Objekt mindestens vorhanden.

Daher kann bei der Objektvariable tier1 vom Typ Lebewesen nur auf das Attribut alter und die Methode getAlter() zugegriffen werden. Bei der Objektvariable tier2 vom Typ Säugetier hingegen kann auf das Attribut alter und die Methode getAlter() der Basisklasse Lebewesen sowie auf das Attribut tragzeit und die Methode getTragzeit() der eigenen Klasse Säugetier zugegriffen werden.

Mehr über Polymorphismus findet ihr in folgendem Beitrag: Grundlagen der objektorientierten Programmierung.

Die zur Beispielanwendung gehörende Textausgabe ist in der unten abgebildeten Kommandozeilenausgabe dargestellt.

Java Vererbung: Ableiten einer Klasse

Java Vererbung: Das Ableiten einer Klasse – Ausgabe der Beispielanwendung

Schachtelung durch Vererbung und das Schlüsselwort final

Wird für eine Klasse keine Vaterklasse direkt angegeben, so bekommt sie automatisch als Vaterklasse die Klasse Object zugewiesen. Somit besitzt in Java jede Klasse eine Vaterklasse, außer der Klasse Object natürlich.

In Java können die Klassen beliebig tief geschachtelt werden, daraus ergeben sich sehr tiefe Vererbungshierarchien. Die abgeleitete Klasse erbt dabei immer die Eigenschaften ihrer direkten Vaterklasse. Die Vaterklasse erbt ihrerseits die Eigenschaften ihrer unmittelbaren Vaterklasse. Das geht so weiter bis an das obere Ende des Ableitungsbaums, an dem immer die Klasse Object steht.

Möchte man das Ableiten von einer Klasse verbieten, so muss das Schlüsselwort final für die Klassendefinition verwendet werden. Damit endet der Ableitungsbaum und das Weitergeben der Klasseneigenschaften ist nicht mehr möglich.

Die Object-Klasse – Die Ursprungsklasse von Java

Wie wir bereits erfahren haben, ist jede Klasse in Java, entweder direkt oder indirekt, von der Object-Klasse abgeleitet. Somit ist die Object-Klasse die Ursprungsklasse oder auch Superklasse aller anderen Klassen.

Die Klasse Object vererbt einige sehr hilfreiche Methoden an ihre Tochterklassen. Dabei ist zu beachten, dass diese elementaren Methoden in den abgeleiteten Klassen unter Umständen noch implementiert werden müssen, um ihre Funktionalität sicherzustellen.

plhq_teaser_hbox_gelb_fotolia_RA Studio_46292813

Unser großes
Android Online-Kurs
Gesamtpaket



Weitere Infos

Folgende Methoden werden von der Object-Klasse definiert:

  • clone() – Erstellt eine Kopie des Objekts
  • equals(Object obj) – Vergleicht, ob zwei Objekte den gleichen Inhalt besitzen
  • hashCode() – Berechnet einen numerischen Wert, der als Schlüssel zum Abspeichern genutzt werden kann
  • toString() – Erstellt eine Zeichenkette, die das Objekt repräsentiert

Comments 1

  1. Pingback: Vererbung und Polymorphismus in Java

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.