Skip to main content

Java Vererbung – Die Hierarchien richtig planen

Java Vererbung hat nichts mit Biologie zu tun.

Die Genetik besagt, dass bestimmte Merkmalsausprägungen von den Eltern auf die Kinder übergehen.
Solche Merkmalsausprägungen sind:

  • die Hautfarbe
  • die Haarfarbe
  • die spezifische Größe und weitere körperliche Merkmale.

Und in Java – was ist da Vererbung?
Lass es uns herausfinden.

Was erwartet dich in diesem Beitrag?

  • Zuerst schauen wir uns den Begriff aus der Biologie an und vergleichen diesen mit der Java Programmierung.
  • Dann wird es konkreter. Und zwar möchte ich dir am Beispiel von Tieren und Tierarten das Java Vererbungskonzept auf verschiedenen Hierarchiestufen vorstellen.
  • Ich zeige dir außerdem, wie du mit Eclipse die einzelnen Hierarchien anschauen kannst.
  • Und ich zeige dir eine Herangehensweise um Java Hierarchien abzubilden und zu planen.


Doch zurück zur Biologie….
Die Genetik besagt, dass bestimmte Merkmalsausprägungen von den Eltern auf die Kinder weiter vererbt werden.

Bei der Java Vererbung sieht das Ganze etwas anders aus.

Denn hier werden nicht die Ausprägungen vererbt, sondern die Merkmale.

Im letzten Beitrag habe ich dir gezeigt, wie du Schablonen für Objekte anlegst.
Wir haben festgestellt, dass durch die Vererbung in Java speziellere Schablonen angelegt werden.

Ganz konkret würde dies bedeuten:
Du legst einen Menschen als Oberklasse oder Elternklasse an.
Und diese Oberklasse bekommt ein Attribut.
Zum Beispiel – Größe.

Das bedeutet, dass jeder Mensch in der Oberklasse eine spezifische Größe haben kann.
Falls du diese Klasse ableitest- also eine Kind-Klasse zur Oberklasse erstellst, erbt diese Klasse das Attribut.

Java-Vererbung-Mensch-Größe

Beispielsweise könntest du eine Klasse Frauen und Männer anlegen.
Und diese Kindklasse würde von der Menschklasse die Möglichkeit zur spezifischen Größenangabe erben.

Nochmal ganz kurz der Unterschied zwischen Genetik und Java Vererbung.

In der Genetik werden Merkmalsausprägung, wie schwarze Haare und blaue Augen vererbt.
Ein Kind erbt also die schwarze Haarfarbe von ihrer Mama.

Java Vererbung Genetik

In Java wird lediglich die menschliche Eigenschaft Haarfarbe mit einer Instanzvariablen angelegt.
Es wird nicht schwarze Haarfarbe vererbt.
Stattdessen legt man in der Oberklasse die Variable an.
Und jedes Objekt der Oberklasse hat dann die Möglichkeit eine individuelle Haarfarbe zu bekommen.

Wenn dann die Klasse abgeleitet wird, bekommt die Kindklasse automatisch die selbe Möglichkeit.
Und dann wird diese Eigenschaft von der Elternklasse auf die Kindklasse vererbt.

In Java geht es, bei der Vererbung, vielmehr um Kategoriesierung oder Spezialisierung.

Doch am besten schaust du dir das Ganze am einfachen Beispiel an.

Jede Java Klasse erbt von einer anderen Klasse.

Werfen wir doch einfach mal einen Blick in die Java API Docs.
Und suche dir irgendeine Klasse aus.

Ganz oben in der Dokumentation findest du die Vererbungshierarchien.

Java Vererbung Java API DOCS

Zum Teil geht diese über gewisse Hierarchiestufen.
Bei anderen Klassen ist die Hierarchie relativ flach.

Aber an oberste Stelle steht in jeder Klassenhierarchie – die Klasse Objekt.
Egal ob du einen Scanner, einen String, ein Array oder dein eigenes Objekt anlegst.
Alle Klassen erben von der Klasse Objekt.

Und die Klasse Objekt bringt ein paar Methoden und ein paar Variablen automatisch mit.
Dadurch, dass deine Objekte, deine Strings oder Arrays alle von der Klasse Objekt erben – stehen diese Methoden und Variablen allen Objekten zur Verfügung.
Ganz automatisch.

Schauen wir uns diesen Umstand in Eclipse an.

In Eclipse kannst du die Vererbungshierachien erkennen.

Im letzten Beitrag zur Java Vererbung hatte ich ein paar Objekte vom Datentyp Pirat und Piratin angelegt.

Wenn ich jetzt auf der Pirat-Referenzvariablen die Punktnotation aufrufe…..
Dann werden mir neben all dem typischen Piraten-, Piratinnen- und Heldenzeug – außerdem die Standardmethoden und Variablen der Klasse Objekt angeboten.

Java-Vererbung-Punktnotation

Und diese Methoden und Variablen hast du bei jedem String, jedem Array und jedem anderen Objekt.

Ganz konkret bedeutet das:
Jedes Piraten- oder Piratinnenobjekt (Piratin und Pirat) erbt von der Klasse Held.
Und außerdem erben sie das ganze Zeug von der Klasse Objekt.

Für die Darstellung der einzelnen Vererbungshierarchien bietet dir Eclipse ein nützliches Werkzeug an.

Markiere einen Datentyp.
So wie ich „Pirat“ oder Piratin.
Und drücke dann F4.

Java Vererbungshierarchien Eclipse anzeigen

Es öffnet sich dann die Type-Hierachie-View.
Es werden dir dann in einem separaten Fenster die einzelnen Hierarchien angezeigt.

Probiere das Gleiche mit einem String oder Array aus.

Java Vererbungsbaum anzeigen Eclipse

Du siehst – ganz oben steht die Klasse Objekt.

Java Vererbung bei Tieren

Schauen wir uns die Vererbung an einem konkreten Beispiel an.
Ich schmeiße einfach einmal ein paar Begriffe in den Raum.

  • 10 Mäuse
  • 20 Katze
  • 19 Wölfe
  • 2 Hunde
  • 4 Pferde
  • 1 Schäferhund
  • 1 Dackel
  • 1 Perserkatze
  • 2 Haflinger
  • 4 Löwen
  • Und eine weiße Hausmaus

Okay, was soll das?
Stell dir vor. Du solltest ein Programm oder ein Spiel entwerfen, welches diese Tiere simuliert.
Und dabei sollte das ganze Programm recht flexibel sein.

Das heißt:
Wenn zum Beispiel eine Wüstenspringmaus später ins Programm soll, geht das ohne Probleme und ohne Neustrukturierung des kompletten Codes.

Also wie gehst du vor?
Eine Möglichkeit besteht darin eine Klasse für jedes Tier anzubieten.
Und diese Klasse hat dann alle Methoden und Variablen, für das jeweilige Tier.

Sobald eine Wüstenspringmaus erwünscht ist, bekommt diese eben eine eigene Klasse.
Und dann kommt in die Wüstenspringmausklasse alle Methoden und alle Variablen für diese spezielle Mausart.

Lass es uns anders tun, okay? 🙂

Alle erwähnten Lebewesen haben Eines gemeinsam.
Du kannst auch sagen:

Alle angeführten Lebewesen passen irgendwie in eine Kategorie.

Denn….
Katzen, Mäuse, Hunde usw. sind alles Tiere.
Und alle Tiere unterscheiden sich auf eine bestimmte Art und Weise – von Schornsteinen, von Gemüse, von Büchern oder von Schränken.

Wir haben somit eine Kategorie an Objekten, welche sich klar von anderen Kategorien unterscheidet.
Und unsere Kategorie heißt Tiere.

Also dann – geht es noch abstrakter bzw. allgemeiner?
Oder anders gesagt:

„Gibt es eine Überordnung von Tieren?“

Ja vielleicht. Und zwar sind alle Tiere Lebewesen.

An dieser Stelle solltest du dich fragen:

„Macht es Sinn noch eine weitere Oberkategorie zu wählen?“

Bis jetzt sollen nur Tiere in das Programm – also was will ich mit Lebenwesen?

Ja klar, wenn du das Klassendesign größer denkst, dann bist du später variabler.

Ganz konkret.
Wenn du später Menschen oder Pflanzen in das Programm holst, dann macht eine Klasse Lebewesen schon Sinn.

Gehen wir einmal davon aus, dass du auch die Tierbesitzer und Tiernahrung haben möchtest.
Dann benötigst du im Programm auch Pflanzen und Menschen.
Okay dann fangen wir mit der Klasse bzw. Kategorie Lebewesen an.

Die erste Hierarchiestufe würde dann Lebewesen sein.

Mein Frage jetzt an dich:
Welche Attribute könnte man einem Lebewesen zuschreiben.

Vielleicht diese:

  • Größe
  • Gewicht
  • Maximale Lebensdauer
  • derzeitiges Alter

Und wie sieht es mit diesen aus?

  • Anzahl der Gliedmaßen
  • Art der Nahrung
  • Verbreitungsgebiet

Na, welche Attribute könnten passen?
Die Fragen, welche du dir jetzt beim Design stellen solltest, lauten in etwa so:

  • Besitzen alle Lebewesen eine individuelle Größe?
    Ja, denn ein Katze ist größer als eine Maus.
    Jede Katze hat außerdem ein andere Größe im Vergleich zu ihren Artgenossen.
  • Besitzen alle Lebewesen ein individuelles Gewicht? – ja
  • Haben alle Lebewesen eine unterschiedliche Lebenserwartung? – ja
  • Kann es sein, dass alle Lebeweise ein derzeit individuelles Alter haben? – na klar
  • Kann man die Anzahl der Gliedmaßen bei jedem Lebewesen bestimmen?- Nein denn Pflanzen haben keine Gliedmaßen
  • Kann man die Nahrung bestimmen?- Auch nein, denn Pflanzen essen nicht im herkömmlichen Sinne
  • Hat jedes Lebewesen ein bestimmtes Verbreitungsgebiet?- Ja

Halten wir fest.
Bis auf die Gliedmaßen und Art der Nahrung passt alles zum Lebewesen.

Java Vererbung Lebewesen

Die Klasse Lebewesen hat, bis auf zwei, alle Attribute und vererbt diese an die Kindklassen Tier, Mensch und Pflanze weiter.
Die beiden Attribute Nahrung und Gliedmaßen passen nur bei den spezielleren Typen – den Tieren und Menschen.

Und weil die Attribute Nahrung und Gliedmaßen etwas spezieller sind, werden diese in den Kindklassen vereinbart.
Somit besitzen alle Lebewesen eine Größe, ein Gewicht usw. Aber nur Tiere und Menschen haben die Eigenschaften für Gliedmaßen und Nahrung.

Hier der bisherige Java Code:
Die Klasse Lebewesen stellt die Standardattribute bereit.

public class Lebewesen {
	int groesse;
	int gewicht;
	int maxLebensdauer;
	int alter;
	String verbreitungsGebiet;
}

Die Klasse Pflanze erbt alle Attribute der Klasse Lebewesen.

public class Pfanze extends Lebewesen {

}

Die Tierklasse erweitert die Lebewesenklasse um zusätzliche Felder.

public class Tier extends Lebewesen {
	int anzahlGlieder;
	String Nahrung;
}

Die Menschklasse erweitert die Lebewesenklasse ebenfalls.

public class Mensch extends Lebewesen {
	int anzahlGlieder;
	String Nahrung;
}

Wenn du jetzt an irgendeiner Stelle im Programm ein Tier-Objekt anlegst, dann:

  1. stehen dir Tiereigenschaften
  2. zusätzlich noch Lebewesen-Felder
  3. und Attribute der Objekt-Klasse zur Verfügung.

Java Vererbung Tier anlegen

Die Objekte sollen aber nicht nur Eigenschaften besitzen.

Sie sollen auch etwas können.
Und hier ein paar gängige Methoden für Lebewesen:

  • wachsen()
  • schlafen()
  • essen()
  • geräuschMachen()
  • bewegen()

Jetzt bist du dran.
Was passt zum Lebewesen und welche Methoden passen eher zu den spezielleren Objekten – Tier, Pflanze und Mensch.

Java Vererbung Methoden Lebewesen

Ich gebe zu – Ich weiß nicht, ob Pflanzen Geräusche machen oder ob sie schlafen.
Im meinem Klassendesign tun sie es nicht.

Und deshalb treffen einige Methoden für alle Lebewesen zu. Andere wiederum nicht.

Das waren die ersten beiden Hierarchiestufen.
Lass und noch tiefer gehen.

Die dritte Stufe im Java Vererbungsbaum trennt die Tiere weiter auf.

Ich mach an dieser Stelle nur noch mit den Tieren weiter.

Wir hatten gesagt, dass:

  • 10 Mäuse
  • 20 Katze
  • 19 Wölfe
  • 2 Hunde
  • 4 Pferde
  • 1 Schäferhund
  • 1 Dackel
  • 1 Perserkatze
  • 2 Haflinger
  • 4 Löwen
  • Und eine weiße Hausmaus

Im Programm enthalten sein sollen.

Aufgrund der Vererbung könnten wir jetzt für jede Tierart eine Klasse anlegen, welche von Tier erbt.

Java Vererbungshierarchie Stufen

Somit würde jede Maus, jede Katze usw.:

  • Größe
  • Gewicht
  • Maximale Lebensdauer
  • Derzeitiges Alter
  • Verbreitungsgebiet

haben.
Alle diese Instanzvariablen hätten sie von der Klasse Lebewesen geerbt.

Außerdem hätten alle Tiere folgende Instanzvariablen:

  • Anzahl der Gliedmaßen
  • Art der Nahrung

Denn diese Eigenschaften hätten sie von der Klasse Tier geerbt.

Und auch bei den Methoden sieht es genauso aus.
Aus der Lebewesenklasse heraus könnten sie: wachsen().

Von der Tierklasse bekommen sie die Methoden:

  • essen()
  • schlafen()
  • geräuschMachen()
  • bewegen()

Macht ein weiterer Split Sinn?

Um diese Frage zu beantworten schauen wir uns doch einmal die Methoden an.
Wie bewegt sich eine Katze?
Wie bewegt sich ein Pferd?

Die Katze springt, klettert und läuft.
Das Pferd klettert auf jeden Fall nicht.
Und deshalb müsste man die bewegen()-Methode in jeder Klasse separat anbieten.

Wie sieht die Sache mit dem Geräusch machen aus?
Selbst ein Schäferhund und ein Dackel unterscheiden sich da.
Also müsste auch die Geräusch-machen-Methode separat angeboten werden.

Hier die bisherigen Hierarchieebenen.
Ganz oben die Lebewesenklasse. Alle Attribute und Methoden stehen Pflanzen, Tieren und Menschen zur Verfügung.

public class Lebewesen {
	int groesse;
	int gewicht;
	int maxLebensdauer;
	int alter;
	String verbreitungsGebiet;
	
	void wachsen(){
		System.out.println("Wird größer und größer");
	}
}

In der zweiten Ebene befinden sich die Tiere. Diese Attribute und Methoden stehen allen Tieren zur Verfügung.

public class Tier extends Lebewesen{
	int anzahlGlieder;
	String Nahrung;
	
	void schlafen(){
		System.out.println("Das Tier schläft");
	}
	
	void essen(){
		System.out.println("Das Tier ist "+Nahrung);
	}
	
	void geraeuschMachen(){
		System.out.println("Brüllen, Fauchen und Wispern");
	}
	
	void bewegen(){
		System.out.println("Das Tier rennt");
	}
}

Und jetzt einige spezielle Tierarten.
Ich habe Hunde, Katzen, Mäuse und Pferde.

public class Katze extends Tier{

	void geraeuschMachen(){
		System.out.println("Die Katze faucht");
	}
	
	void bewegen(){
		System.out.println("Das Katze springt, läuft und klettert");
	}
}

Die Hundetypen.

public class Hund extends Tier {
	
	void geraeuschMachen(){
		System.out.println("Wau, Wau");
	}
	
	void bewegen(){
		System.out.println("Der Hund läuft");
	}
}

Die Pferde.

public class Pferd extends Tier {
	
	void geraeuschMachen(){
		System.out.println("BrrrHHHH");
	}
	
	void bewegen(){
		System.out.println("Galopp, Trapp und Rennen");
	}
}

Und die Mäuse.

public class Maus extends Tier {
	
	void geraeuschMachen(){
		System.out.println("Piep, Piep");
	}
	
	void bewegen(){
		System.out.println("Klettern, Laufen und Springen");
	}
}

Spiele die Sache einmal bis hierher mit einem Pferd durch.
Also lege in der Programmstart Klasse ein Pferd an.

public class LebewesenSimulation {

	public static void main(String[] args) {
		Pferd blackBeauty = new Pferd();
		
		blackBeauty.gewicht=200;//Das Pferd bekommt das Gewicht von Lebewesen
		blackBeauty.groesse=120;//Das Pferd bekommt die Größe von Lebewesen
		
		blackBeauty.Nahrung="Heu"; //Das Pferd bekommt Nahrung aus der Klasse Tier
		blackBeauty.anzahlGlieder=4;//Das Pferd bekommt die Beine aus der Klasse Tier
		
		blackBeauty.essen();//Das Pferd issst wie jedes Tier. Die Methode aus Klasse Tier
		blackBeauty.geraeuschMachen();//Pferdegräusche aus Klasse Pferd
		blackBeauty.bewegen();//Bewegen aus Klasse Pferd
	}
}

Du siehst das Pferd bekommt aus den einzelnen Klassen, entlang des Vererbungsbaumes, Attribute und Methoden.
Ein Pferd kann also:

  • sich bewegen, wie nur ein Pferd es kann
  • kann spezielle Pferdegeräusche machen
  • Und den ganze Rest macht es so, wie jedes andere Tier bzw. Lebewesen.

Cool, oder? 🙂
Du kannst unendlich viele Stufen tiefer gehen.
Zum Beispiel können Haflinger vielleicht besonders schnell laufen.
Dann mach eine Klasse Haflinger, welche von Pferd erbt und überschreibe die Pferd-Methode bewegen().

Ich möchte auch noch eine Stufe tiefer gehen.

Stufe 4 im Java Vererbungsbaum.

Ich pick nur noch einen bestimmten Zweig aus dem Baum heraus.
Und zwar die Hunde.

Wenn ich jetzt einen Wolf machen möchte, kann dieser von Hund erben.
Dadurch kann der Wolf schon all das, was ein Hund kann.

Aber der Wolf soll noch heulen.
Also biete ich zusätzlich zum Hundekram eine heulen()-Methode nur für Wölfe an.

public class Wolf extends Hund{

	void heulen(){
		System.out.println("AAAAHHHUUUU");
	}
}

Wenn ich dann wiederum einen Wolf anlegen, kann dieser den ganzen Hunde-, Tier- und Lebewesenkram.
Aber zusätzlich kann der Wolf heulen.

public class LebewesenSimulation {

	public static void main(String[] args) {
		Wolf grauWolf = new Wolf();
		
		grauWolf.gewicht=60;//Der Wolf bekommt das Gewicht von Lebewesen
		grauWolf.groesse=80;//Der Wolf bekommt die Größe von Lebewesen
		
		grauWolf.Nahrung="Fleisch"; //Der Wolf bekommt Nahrung aus der Klasse Tier
		grauWolf.anzahlGlieder=4;//Der Wolf bekommt die Beine aus der Klasse Tier
		
		grauWolf.essen();//Der Wolf frisst wie jedes Tier. Die Methode aus Klasse Tier
		grauWolf.geraeuschMachen();//Geräusche aus Klasse Hund
		grauWolf.bewegen();//Bewegen aus Klasse Hund
		
		grauWolf.heulen();//Nur ein Wolf heult
	}
}

Zum Vergleich:
Ein Hund kann nicht heulen.

Java VererbungsHierarchie Hund Wolf

Zusammenfassung:

  • Java Vererbung hat nichts mit Genetik zu tun.
  • Es geht bei diesem Konzept vielmehr um Kategoriesierung.
    Welches Objekt passt zu welcher Kategorie.
  • Dabei werden abstrakte Typen festgelegt. In unserem Beispiel waren es die Lebewesen.
    Und diese allgemeinen oder abstrakten Typen können all das, was alle Lebewesen können.
  • In spezielleren Unterklassen werden dann bessere Typen angeboten, welche mehr können.
    Und diese konkreteren Datentypen sind dann auch die besseren Schablonen für zukünftige Objekte.