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.

Ähnliche Beiträge

Java Duales Zahlensystem – Binäre Zahlen in Java umwandeln

Java Dual System

Das duale Zahlensystem hat viele Bezeichnungen. Oft wird auch es Dualsystem oder Binärsystem genannt. Es besteht aber immer aus 2 Zahlen. Man verwendet oft die Zahlen 0 und 1. Es können aber auch sämtliche anderen Zahlenpaare sein. Zum Beispiel 7 und 175 sind für sich genommen, auch ein normales Zahlenpaar und somit ein Dualsystem. Mit […]

Das Instanzieren von Java Klassen verhindern

Java Objekte Instanzieren verhindern

Die Instanzierung von Java Klassen verhindern. Was heißt das? Instanzen sind die Objekte einer Java Klasse. Und Instanzieren oder Instanzierung heißt nichts anderes, als Objekterstellung. Aber was soll das? Oder mal anders gefragt: Wieso sollte man verhindern, dass eine Java Klasse – Objekte erstellen kann? Schließlich sind doch Objekte der Sinn und Zweck jeder objektorientierten […]

Java Übung 17: Char-Zeichen mit For-Schleife

Java Übung Char Zeichen For Schleife

In dieser Java Übung werden wir uns die Zeichen des Character Datentypen näher anschauen. Die einzelnen Zeichen sollen auf der Konsole ausgegeben werden. Und wie? Das ganze sollst du mit einer For Schleife machen. Erstelle deshalb eine Klasse „CharZeichen“. In dieser Klasse implementierst du dann eine Klassenmethode, namens „gibZeichen“. Und im Methodenrumpf durchläuft eine For-Schleife […]

So kannst du in drei einfachen Schritten Java Arrays dynamisch vergrößern

Java Arrays vergrößern

Es ist der 31.März 1727. Es ist ein Montag. Die Welt nimmt Abschied von einem sehr bedeutenden Weltveränderer. Seine Sichtweisen beeinflussen, heute noch, die Forschung und Entwicklung im Bereichen der Physik und Chemie. Ja selbst unser aller Leben – unsere Sicht auf die alltäglichen Dinge – wurden durch seine Denkstöße revolutioniert. Dieser große Vorreiter starb […]

Den Java Vererbungsbaum nach dem Ist-Es-Prinzip richtig entwerfen

Java Vererbungsbaum

Vererbungsbaum in Java – klingt erstmal komisch. Dennoch wird dies so bezeichnet. Gemeint sind damit – die einzelnen Hierarchiestufen oder Vererbungsebenen – von der Superklasse bis runter zu den Kindklassen. Wie sieht das nun konkret aus? Vererbung bedeutet: Du definierst einen allgemeinen Typen – zB. Möbel Und dann implementierst du eine Unterklasse, welche die Oberklasse […]

So nutzt du das Java Keyword public

Java Keyword public

Java Programme bestehen aus Java Klassen. Und der Zugriff auf eine Java Klasse sollte nach außen immer gewährleistet sein. Was bedeutet das? Du solltest in jeder Klasse die Möglichkeit haben, ein Objekt einer anderen Klasse anzulegen. Gerade durch diese Möglichkeit macht doch das ganze Klassenkonstrukt erst Sinn.

So kannst du ein Java Programm starten und Argumente übergeben

Um ein Java Programm starten zu können, benötigst du immer die main-Methode. Das Programm startet immer genau an dieser Stelle. Alle lokalen Variablen, welche du in der Main Methode anlegst, kannst du dann im Programm nutzen. Auch alle Methoden, welche du innerhalb des Methodenrumpfes der main-Methode aufrust, werden ausgeführt. Was ist aber vor der main-Methode. […]

So kannst du Java Konstruktoren anlegen und überladen

Java Konstruktoren

Der Name sagt es schon. Java Konstruktoren konstruieren oder bauen Java Objekte. Und diese Objekte baut der Konstruktor auf Vorlage der entsprechenden Java Klasse. In diesem Beitrag zeige ich dir natürlich verschiedene Ansätze wie du den Konstruktor einsetzt. Ich zeige dir dies Schritt für Schritt. Dabei zeige ich dir auch verschiedene Dinge, welche nicht funktionieren. […]

So kannst du Java Arrays anlegen

Java Arrays anlegen

Java Arrays– Was ist das? Stell es dir einmal als ein Bücherregal vor. In einem Bücherregal befinden sich sämtliche Bücher. Und diese befinden sich schön nebeneinander. Jedes Buch hat seinen festen Platz. Du kannst die Bücher ganz genau lokalisieren. Zum Beispiel kannst du sagen. Das erste Buch von links Das dritte von rechts usw. Und […]