Skip to main content

So sorgt Java Polymorphie für besseren Code und mehr Möglichkeiten


java programmierung polymorphie code möglichkeiten

Polymorphie ist das Herzstück jeder objektorientierten Sprache.
Nicht nur in Java – auch in Python, Javascript und in anderen Sprachen.

Aber was bedeutet Polymorphie eigentlich?
Polymorphie oder auch Polymorphismus genannt, kommt aus dem Griechischen.
Es bedeutet Vielgestaltigkeit.
Etwas freier übersetzt, kannst du es auch als Facettenreichtum bezeichnen.

Im Grunde genommen zielt die ganze Java Vererbung darauf ab, dass du doppelten Code vermeiden kannst.
Und dies hat dann zum Vorteil, dass du deinen Code besser warten und erweitern kannst.

Und Polymorphie setzt dem Ganzen die Krone auf.
Denn durch dieses Feature wird dein Code extrem flexibel.

Doch…
Am besten ich zeige es dir an einem Beispiel.

Java Polymorphie am Beispiel einer Figurenklasse.

Ich habe einmal drei Klassen angelegt.
Eine Superklasse namens Figur.

public class Figur {
	String farbe;//Farbe der Figur
	
	void info(){
		System.out.println("Die Figur ist "+farbe);
	}
}

Und die Unterklassen „Viereck“ und „Dreieck“ erweitern diese.

public class Viereck extends Figur{

	int laengeA;//Länge der Seite A
	int laengeB;//Länge der Seite B
	
	void berechneFlaeche(){
		System.out.println("Fläche vom Viereck");
	}
}

public class Dreieck extends Figur{

	void berechneFlaeche(){
		System.out.println("Fläche vom Dreieck");
	}
}

So kannst du dir dies grafisch vorstellen:

Java-Polymorphie-Vererbungsbeispiel

Dazu noch eine Programmstart-Klasse mit main-Methode.
In dieser habe ich bereits drei Objekte erstellt.

public class ProgrammStart {

	public static void main(String[] args) {
		Figur figurEins = new Figur(); //Figuren-Objekt
		Viereck vierEins = new Viereck();//Objekt der Klasse Viereck
		Dreieck dreiEins = new Dreieck();//Objekt der Klasse Dreieck
		
	}
}
  • Das Objekt „figurEins“ stammt aus der Superklasse.
    Somit kann die Referenzvariable auf Methoden und Variablen der Klasse „Figur“ zugreifen.
  • Die Eigenschaften und Methoden der Unterklassen „Viereck“ und „Dreieck“ stehen nicht zur Verfügung.

Hier die Punktnotation zum Figuren-Objekt:

Java-Polymorphie-Superklasse-Zugriff

  • Das Dreieck kann mehr.
  • Es vereint die Eigenschaften und Methoden der Figurenklasse und der Dreiecksklasse.

Hier ist das Bild dazu:

Java-Polymorphie-Unterklassen-erweitern

  • Das Viereck hat noch mehr Eigenschaften bzw. Variablen.
  • Denn auch das Viereck hat neben den Eigenschaften der Figurenklasse, ebenfalls die Eigenschaften der Vierecksklasse.

Dieses Bild macht auch dies deutlich:

Java-Polymorphismus-Unterklassen-Beispiel

Okay…
Bis jetzt ist dies ganz normale Java Vererbung.
Polymorphie geht noch einen Schritt weiter.

Doch lass uns erst einmal einen Schritt zurück.

Schauen wir uns das Objekte-Erstellen mal näher an.

Die Erstellung des Objektes erfolgt in mehreren Schritten.

Java-Polymorphie-Objekt-anlegen

  • Es wird ein Speicherplatz reserviert.
    Die Größe entspricht dem Datentypen – Figur, Dreieck oder Viereck.
  • Der Verweis auf diesen Speicherplatz wird in einer Variable gespeichert.
    Zum Beispiel: figurEins, vierEins oder dreiEins (Siehe unser Beispiel)
  • Mit dem Konstruktoraufruf wird dann ein tatsächliches Objekt aus der Klasse Figur, Dreieck oder Viereck angelegt.

Du kannst sagen:

  • Alles was links neben dem Zuweisungsoperator (Gleichheitszeichen) steht, dient als Verweis auf den Speicher (Heap).
  • Und alles was rechts neben dem Zuweisungsoperator steht, dient der Objekt-Erstelllung.

In unserem Beispiel zeigen somit drei Referenzvariablen – auf drei unterschiedliche Objekte im Speicher.

Java-Polymorphie-lokale-Referenzvariablen

So weit – so gut.
Jetzt erstell ich einmal ein neues Dreieck, aber nicht vom Datentyp Dreieck – sondern vom Datentyp Figur.

public class ProgrammStart {

	public static void main(String[] args) {
		Figur figurEins = new Figur(); //Figuren-Objekt
		Viereck vierEins = new Viereck();//Objekt der Klasse Viereck
		Dreieck dreiEins = new Dreieck();//Objekt der Klasse Dreieck
		
		Figur dreieckZwei = new Dreieck();//neues Dreieck vom Datentyp Figur
		
	}
}

Du siehst: Es erscheint keine Fehlermeldung.

java polymorphie verschiedene datentypen

Trotz strenger Typisierung lässt es Java zu, dass du für ein Dreieck – einen fremden Datentypen – reserviert.
Die Datentypen Dreieck und Figur scheinen kompatibel zu sein.

Was steckt jetzt drin- ein Dreieck oder eine Figur?
Es handelt sich hierbei immer noch um ein vollwertiges Dreieck.

Du kannst somit ein Objekt vielfältig anbieten.
Dies ist Polymorphie.

Aber wie weit geht das Ganze?

Das Substitutionsgesetz der Java Polymorphie

Beachte…
Java ist streng typisiert.
Diese Polymorphie funktioniert nur bei höheren bzw. komplexen Datentypen, wie Objekten.
Mit einen Integer oder Boolean funktioniert das nicht.

Java Polymorphie-Primitive-Datentypen

Substitution bedeutet „Ersetzen“.
Du kannst also einen komplexen Datentyp durch einen anderen ebenfalls komplexen Datentyp ersetzen.
Aber nur bei Datentypen, welche sich in der gleichen Vererbungslinie befinden.

Das Dreieck oder das Viereck sind beides Figuren.
Sie sind somit Spezialfälle der Superklasse „Figur“.

Durch Polymorphie werden die Eigenschaften der Objekte versteckt.

Versteckt ist vielleicht nicht der richtige Ausdruck.
Viel besser ist es zu sagen:

„Die Objekte schützen ihre Eigenschaften nach außen.“

Denn jetzt ist es so, dass du nicht mehr auf die spezialisierten Eigenschaften der Dreiecksklasse zugreifen kannst.
Du kannst weder die Instanzmethoden aufrufen, noch den Instanzvariablen – Werte zuweisen.
Das Objekt verbirgt den Zugriff nach außen.

Java-Polymorphie-Verborgene-Eigenschaften-Objekte

Und die andere Richtung?

Ist es möglich eine Figur vom Datentyp Dreieck anzulegen?

Andersrum funktioniert es nicht.

Java-Polymorphie-andere-Richtung

Du kannst keine Figur anlegen, welche du dann in ein Dreieck oder Viereck steckst.
Denn lies den Code einmal von rechts nach links.
Java-Polymorphie-Datentypen-zusammenpassen

  • Ist jedes Dreieck eine Figur? – Ja
  • Und ist jedes Viereck eine Figur? – Auch ja

Aber:

  • Ist jede Figur ein Dreieck? – Nein
  • Und ist jede Figur ein Viereck- ebenfalls nein

Java-Polymorphie-Datentypen-unzulässig

Man kann sagen:
Es gibt neben Dreiecke noch andere Figuren.
Der Datentyp Figur ist somit viel weitreichender als ein Dreieck.
Und deshalb passt zwar ein Dreieck in den Figur-Datentypen.
Aber umgedreht funktioniert es nicht.

Formal gesagt, bedeutet Substitution:

„Du kannst ein Objekt erzeugen und diesem Objekt einen anderen Datentypen zuweisen.
Aber dieser andere Datentyp muss in der selben Vererbungslinie und mindestens eine Stufe höher, als das erzeugte Objekt sein.“

Du kannst die Zuordnung auch noch später vollziehen.

Beispielsweise so:

public class ProgrammStart {

	public static void main(String[] args) {
		Figur figurEins = new Figur(); //Figuren-Objekt
		Viereck vierEins = new Viereck();//Objekt der Klasse Viereck
		Dreieck dreiEins = new Dreieck();//Objekt der Klasse Dreieck
		
		dreiEins.farbe="Gelb";//Dreieck ist jetzt gelb
		figurEins=dreiEins;//Figur-Objekt wird zerstört. Die Ref.-Variable zeigt auf das Dreieck.
		
		figurEins.info();//Bildschirmausgabe zur Kontrolle = Gelbes Dreieck
		
	}
}

Probiere den Code einmal aus.
Aufgrund des Umswitchens der Referenzvariablen wird das Figuren-Objekt aufgegeben und zerstört.
Wenn du dann mittels Punktnotation auf die „Figuren-Referenzvariable“ zugreifst, landest du immer beim Dreieck.

Was bewirkt diese Java Polymorphie? Welchen Vorteil bringt Polymorphismus

Was müsstest du tun, wenn du alle Figuren vergrößern möchtest?
Da Java streng typisiert ist, musst du ohne Polymorphie für sämtliche Figurentypen Extra-Methoden anlegen.
Und diesen Methoden kannst du dann einen Parameter vom Typ „Dreieck“ oder „Viereck“ übergeben.

Java-Polymorphie-Methoden-Übergabe

Sobald du neue Figurentypen in dein Programm implementierst, brauchst du neue Methoden – zum Beispiel für Kreise.
Durch die Java Polymorphie kannst du jetzt eine Methode anbieten und ihr den abstrakten Datentyp „Figur“ übergeben.
Du musst diese Methode auch nie wieder abändern. Denn der Polymorphismus bewirkt, dass später auch Kreise verarbeitet werden können.
Java Polymorphie-Methoden-Vorteile

Oder Arrays.
Ohne Polymorphie kannst du lediglich Objekte vom selben Datentypen in einem Array speichern.
Mit Polymorphie kannst du sämtliche Objekte der selben Vererbungslinie in dieses Array stecken.
Java-Polymorphie-Vorteile-Arrays

Die Vorteile von Polymorphie sind:

  • Der Code ist besser zu warten.
  • Dein Java Code ist leichter zu erweitern.
  • Die Objekte verstecken nach außen ihre Methoden und Eigenschaften.
    Dadurch werden diese besser geschützt.
  • Du bist bei der Programmierung sehr viel flexibler.

Zusammenfassung:

  • Polymorphie bewirkt, dass du ein Objekt anlegen und dabei abstraktere Datentypen verwenden kannst.
  • Dadurch erreichst du, dass dein Code besser wartbar, leichter erweiterbar und flexibler ist.
  • Die Java Polymorphie geht dabei nur in eine Richtung.
    Du kannst lediglich Datentypen verwenden, welche in der Vererbungslinie hierarchisch weiter oben stehen. (Superklassen)

Ähnliche Beiträge

So kannst du Java installieren

java-installieren

Bevor du loslegst und deine ersten Java Programme schreibst, benötigst du die entsprechende Arbeitsumgebung. Du solltest also Java installieren. Und diese Arbeitsumgebung beinhaltet dann Bibliotheken für die einzelnen Java-Standard-Klassen, Dateien um deine Programme auszuführen. Dateien um deine Programme zu packen, Logische Verzeichnisstrukturen

Java Konsolenausgaben mit formatierten Zahlen

java programmierung konsolenausgabe mit formatierten zahlen

Java Konsolenausgaben erzeugst du mit der System.out.println()-Anweisung. Dies ist relativ einfach. Aber es ist mitunter nicht ganz praktisch. Und zwar immer dann, wenn Zahlen im Spiel sind. Die Zahlen welche dann auf deiner Java Konsole erscheinen, sind unformatiert. Sie haben zu viele Kommastellen. Oder für eine bessere Darstellung benötigst du […]

So kannst du spielend Java Programmierung lernen

java programmierung lernen

Ich lernte die Java Programmierung auf die klassische Art. Ich kaufte mir das erste Buch und los ging es. „Jetzt wirst du Java lernen“ – sagte ich zu mir. Ich war relativ schnell ziemlich frustriert, denn irgendwie fehlten mir ein paar Zusammenhänge. Kennst du das? Du hast ein Wissensfetzen und […]

Die 5 verschiedenen Zahlensysteme in der Java Programmierung

java programmierung zahlensysteme

Java Zahlensysteme – Was soll das? In sämtlichen Programmiersprachen werden Zahlen in Variablen abgespeichert. Wenn du dir die einzelnen primitiven Datentypen in Java einmal anschaust – wirst du feststellen – dass die Masse der Datentypen Zahlen annehmen und speichern können. Zahlen und die Mathematik dahinter spielen in der Programmierung eine […]

Dies sind die Vorteile von polymorphen Java Arrays

java programmierung polymorphie arrays

Wenn Java Arrays, Schubladen oder Container sein sollen… Dann wäre der Gebrauch einer solchen Schublade ziemlich einseitig und festgefahren. Denn in jedes Array passen zwar mehrere Daten – aber immer nur vom gleichen Datentyp. Immer gleicher Datentyp? Also eine Schublade nur für Socken, Unterwäsche und der ganze andere Kram passt […]

So funktioniert die Java Konsoleneingabe über den Scanner

java programmierung konsoleneingabe scanner

Es wird Zeit für die erste Java Konsoleneingabe. Und diese Eingaben machst du über den Java Scanner. Was ist das? Der Scanner ist eine vorgefertigte Java Klasse, welche Java mit seiner API anbietet. Das heißt du musst nichts selbst erschaffen. Du musst nur wissen, wie du darauf zugreifst. Erst einmal […]

Unterschied zwischen Klassenvariable und Instanzvariable im Java Programm

unterschied klassenvariable instanzvariable java programmierung

Bei der Java Programmierung unterscheidet man drei Arten von Variablen. Als erste Gruppe sind die lokalen Variablen zu nennen. Auf diese gehe ich in einem separaten Artikel ein. Mich interessieren die zwei anderen Variablentypen. Zum einen existieren Klassenvariablen. Und dann sind da noch die Instanzvariablen. Wo liegt der Unterschied zwischen […]

Zwei smarte Möglichkeiten eine Java Zufallszahl zu erzeugen

java zufallszahl anlegen erzeugen

Java Zufallszahl – Wieso? In der Java Programmierung benötigst du immer wieder einmal Zufallszahlen. Du möchtest deine Software mit Daten testen und dir keine Zahlen ausdenken. Du benötigst Stichproben, welche ein reales Verhalten simulieren. Du hast ein Spiel entworfen und die Akteure sollen mit zufälligen aber unterschiedlichen Größen, Rüstungsleveln usw. […]

So solltest du Kommentare im Java Programm einsetzen

java programmierung kommentare

Bei der Java Programmierung sind Kommentare mitunter genauso wichtig wie der eigentliche Code. Denn ein guter Kommentar zeigt dir sofort, was mit dem Code gemeint ist, was dieser bewirkt und was sich der Entwickler dabei dachte. Wie werden Kommentare in Java gesetzt? Die Kommentare werden in Eclipse immer grün dargestellt. […]

Namenskonventionen bei der Java Programmierung

java-programmierung-namenskonvention-lowercasecamelcase

Beiderjavaprogrammierungsolltestduaufdierichtigenamensvergabeachten. indennnamengebendeinenjavaprogrammeinegrundlegendestruktur. Was sagen dir die beiden oberen Sätze? Häh? Da steht: Bei der Java Programmierung solltest du auf die richtige Namensvergabe achten. Denn Namen geben deinem Java Programm eine grundlegende Struktur. Jede Sprache braucht Regeln. Diese Regeln, wie Grammatik oder Rechtschreibung geben der Sprache eine Struktur. Jeder Leser, welcher […]

So kannst du Konstanten in Java Programmen anlegen und nutzen

java programmierung konstanten anlegen und nutzen

Java Konstanten – was kann man sich darunter vorstellen? Du kennst Konstanten in der Mathematik. Die Kreiszahl Pi ist so eine konstante Zahl. Diese Zahl ändert sich niemals. Sie beträgt immer rund 3,141592. In der Physik gelten die Lichtgeschwindigkeit, der Erdradius oder der absolute Nullpunkt als konstant. Selbst die Geschwindigkeit […]

Java Anfänger Übung: Hello World

Java-Übung-Hello-World

Alles beginnt mit „Hello World“. Sämtliche Java Bücher beginnen mit diesem ersten Beispiel. Auch die Java Übungen sollen mit diesem ersten Programm starten. Definiere eine Klasse „Hello World“. Implementiere die Main Methode. Die Main Methode soll bei Programmaufruf die Bildschirmanzeige „Hallo Welt“ zurückgeben. Die Lösung zur Java Übung „Hallo Welt“ […]

Syntax, Semantik und Lexikalik in der Java Programmierung

java programmierung lexikalik syntax semantik

Java ist eine Programmiersprache. Und wie jede andere Programmiersprache ist auch Java, lediglich eine künstliche Sprache.   Normalerweise bieten künstliche Projekte immer jede Menge Spielraum für Eigenkreationen. Bei der Programmierung ist dies nicht ganz so. Denn Programmiersprachen sind auch immer sehr exakt.   Jede Programmiersprache und auch jede gesprochene Sprache […]

Lokale Variablen im Java Programm: Lebensdauer und Nutzung

lokale variablen im java programm

Lass uns über die Lebensdauer einer lokalen Variablen sprechen. Warum ausgerechnet die Lebensdauer? Alle Java Variablen, unterscheiden sich in folgenden Punkten: wo diese deklariert werden können, wie du diese aufrufen kannst, welchen Bereich diese abdecken, und Ihre Lebensdauer Und eine lokale Java Variable hat eine relativ kurze Lebensdauer. Schauen wir […]

So funktioniert der Java Programmstart mit Argumenten-Übergabe

java programmierung programmstart argumente

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 […]

So kannst du in Java eine Binärzahl in eine Dezimalzahl umwandeln

java programmierung binärzahl in dezimalzahl umwandeln

Erinnerst du dich? In einer der letzten Beiträge haben wir uns die Zusammenhänge zwischen dem dualen und dem dezimalen Zahlensystem angeschaut. Aber wir haben noch keine Java Binärzahl in eine Dezimalzahl verwandelt. Zumindestens nicht praktisch…. Stattdessen…. Haben wir festgestellt, dass beide Zahlensysteme im Grunde genommen sehr ähnlich sind. Beim Dezimalsystem […]