Skip to main content

Polymorphie bringt Vorteile für Java 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 dann eben nicht hinein.

Um das zu ändern, gibt es das Feature Polymorphie.
Polymorphe Java Arrays sind in der Lage mehrere unterschiedliche Datentypen zu speichern.

Wie das Ganze funktioniert und worauf du dabei unbedingt achten musst – das zeige ich dir jetzt.

Die Vorteile von Java Polymorphie am Beispiel.

Ich finde das Beispiel mit den Schubladen ganz toll.
Also erstell ich zwei Klassen – Socke und Shirts.

Java Polymorphismus Klassen erstellen

Shorts, T-Shirts oder auch Socken dienen einem Zweck – dem Warmhalten der besten Stücke. 🙂
Und deshalb bekommen beide Klassen jeweils noch eine Methode verpasst.
Diese macht nichts weiter als eine Bildschirmausgabe zum Warmhalten zu produzieren.

public class Socke {

	void warmHalten(){
		System.out.println("Die Socke hält deine Füße warm.");
	}
}

Und die Klasse Shirt:

public class Shirt {

	void warmHalten(){
		System.out.println("Das Shirt hält deinen Oberkörper warm.");
	}
}

Dazu noch eine Klasse „SockenShirtSimulator“, in welcher die main-Methode implementiert wird.
Somit kannst du das Programm direkt aus dieser Klasse heraus starten.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		
	}
}

Okay was nun?
Als Nächstes erzeuge ich einige Objekte vom Datentyp „Socke“ und Einige vom Typ „Shirt“.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();//Objekt der Klasse Socke
		Socke sockeRot = new Socke();//ein weiteres neues Socke-Objekt
		Socke sockeGelb = new Socke();//drittes Socke-Objekt
		
		Shirt shirtBlau = new Shirt();//Shirt Objekt
		Shirt shirtRot = new Shirt();//zweites Objekt aus der Klasse Shirt
		Shirt shirtGelb = new Shirt();//drittes Shirt
		
	}
}

Soweit ist alles normal.

Was passiert aber, wenn du diese Objekte in einem Array, namens „kleiderSchrank“ oder „schublade“ speichern möchtest?
Das Bild dazu macht es deutlich.

Java Polymorphie Arrays Fehler

Es kommt zur Fehlermeldung.
Natürlich kommt es dazu – Denn in einem Java Array können nur Objekte gespeichert werden, welche dem gleichen Typ des Arrays entsprechen.
Java Polymorphie Arrays erstellen

Und da das Array vom Typ Socke ist, können natürlich nur Socken in diesem Array gespeichert werden.

Also brauchst du im Normalfall ein zweites Array für Shirts.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();
		Socke sockeRot = new Socke();
		Socke sockeGelb = new Socke();
		
		Shirt shirtBlau = new Shirt();
		Shirt shirtRot = new Shirt();
		Shirt shirtGelb = new Shirt();
		
		Socke [] schublade = new Socke [3];//Socken-Array
		schublade[0]=sockeBlau;
		schublade[1]=sockeRot;
		schublade[2]=sockeGelb;
		
		Shirt [] schubladeShirt = new Shirt[3];//Shirt-Array
		schubladeShirt[0]=shirtBlau;
		schubladeShirt[1]=shirtRot;
		schubladeShirt[2]=shirtGelb;
			
	}
}

Kein Problem, oder?
Wenn du das ganze Array mit einer Schleife einmal auslesen möchtest, musst du dies immer zweimal machen.
Einmal für die erste Schublade mit den Socken.
Und eine zweite Schleife für die Schublade mit den T-Shirts.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();
		Socke sockeRot = new Socke();
		Socke sockeGelb = new Socke();
		
		Shirt shirtBlau = new Shirt();
		Shirt shirtRot = new Shirt();
		Shirt shirtGelb = new Shirt();
		
		Socke [] schublade = new Socke [3];//Socken-Array
		schublade[0]=sockeBlau;
		schublade[1]=sockeRot;
		schublade[2]=sockeGelb;
		
		Shirt [] schubladeShirt = new Shirt[3];//Shirt-Array
		schubladeShirt[0]=shirtBlau;
		schubladeShirt[1]=shirtRot;
		schubladeShirt[2]=shirtGelb;

		//Auslesen Array für Socken
		for (int i = 0; i < schublade.length; i++) {
			schublade[i].warmHalten();
		}
		
		//Auslesen Array für Shirts
		for (int i = 0; i < schubladeShirt.length; i++) {
			schubladeShirt[i].warmHalten();
		}
	}
}

Klicke auf „RUN“.
Und läuft?

Aber mal ganz ehrlich.
Stell dir einmal so eine Schublade vor.
Socken „JA“ – Shirts „NEIN“ – zu blöd, oder?

Die Probleme mal ganz konkret:

  1. Du hast immer doppelten Code und doppelte Schleifen.
  2. Es handelt sich um ein unrealistisches Modell eines Schubfaches, welches „NEIN“ zu Shirts sagt.
  3. Spätere Programmstrukturen müssen immer mehrfach eingefügt, angepasst und gewartet werden.

Also dann – Geht es auch anders und irgendwie besser?

Nutzen wir doch die Vorteile der Java Vererbung bzw. Polymorphie….

Ich sprach im Zusammenhang mit Vererbung immer von der „Vermeidung von doppelten Code“.
Und so ist es natürlich auch hier.

Also lass es uns nutzen. 🙂

Wie könnte die Vererbungslinie in diesem Java Beispiel aussehen?

Am Besten ist es immer die „IST-ES-EIN-FRAGE“ zu stellen.
Somit findest du eine übergeordnete Klasse, welche zu beiden Klassen und deren Objekten passt.

Wie wäre es mit Kleidung?

java-polymorphismus-vererbung

Und jetzt die „IST-ES-EIN“ bzw. „IST-ES-EINE-FRAGE“:

  • Ist die Socke ein Kleidungsstück?
  • Ist das Shirt ein Kleidungsstück?

Zweimal „Ja“ – passt also?

Gehen wir sicherheitshalber noch ein Stückchen weiter:

  • Ist denn auch jede Socke ein Kleidungsstück?
  • Und ist denn auch jedes Shirt ein Kleidungsstück?

Ebenfalls zweimal „ja“.

Somit passt die Vererbungslinie.
Und dies bedeutet für Dich:
Du erstellst also eine neue Klasse, namens Kleidung.

public class Kleidung {
	
	void warmHalten (){
		System.out.println("Diese Kleidung hält dich warm");
	}

}

Und die beiden Java Klassen „Socke“ und „Shirt“ werden zu Kindklassen der Superklasse „Kleidung“.

public class Socke extends Kleidung{

	void warmHalten(){
		System.out.println("Die Socke hält deine Füße warm.");
	}
}
public class Shirt extends Kleidung{

	void warmHalten(){
		System.out.println("Das Shirt hält deinen Oberkörper warm.");
	}
}

Was nun?
Was ist nun besser?

Jetzt kommt der Java Polymorphismus ins Spiel.

Erinnerst du dich?
Polymorphie erlaubt es dir, einen spezielleren Datentyp („Socke“ oder „Shirt“) als allgemeinen Datentyp anzulegen.
Das bedeutet, dass du jede Socke – als „Kleidungsobjekt“ anlegen kannst.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Kleidung sockeBlau = new Socke();//Jede Socke ist auch Kleidung
		Kleidung sockeRot = new Socke();//Jede Socke kann als Kleidungs-Datentyp angelegt werden
		Kleidung sockeGelb = new Socke();
		
		Kleidung shirtBlau = new Shirt();
		Kleidung shirtRot = new Shirt();
		Kleidung shirtGelb = new Shirt();

	}
}

Und natürlich bedeutet dies auch, dass du ein „Kleidungsarray“ anlegen kannst.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();
		Socke sockeRot = new Socke();
		Socke sockeGelb = new Socke();

		Shirt shirtBlau = new Shirt();
		Shirt shirtRot = new Shirt();
		Shirt shirtGelb = new Shirt();

		Kleidung schublade[] = new Kleidung[6];//Polymorphes Kleidungsarray kann beide Typen speichern
	}
}

Und in diesem allgemeinen Array kannst du alle spezielleren Datentypen, innerhalb der Vererbungslinie, speichern.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();
		Socke sockeRot = new Socke();
		Socke sockeGelb = new Socke();

		Shirt shirtBlau = new Shirt();
		Shirt shirtRot = new Shirt();
		Shirt shirtGelb = new Shirt();

		Kleidung schublade[] = new Kleidung[6];
		schublade[0] = sockeBlau;//Socke in Fach Null
		schublade[1] = sockeRot;
		schublade[2] = sockeGelb;
		schublade[3] = shirtBlau;//Shirt in Fach 3
		schublade[4] = shirtRot;
		schublade[5] = shirtGelb;
	}
}

Und dann benötigst du nur noch eine Programmstruktur um das ganze Array zu lesen.

public class SockenShirtSimulator {

	public static void main(String[] args) {
		Socke sockeBlau = new Socke();
		Socke sockeRot = new Socke();
		Socke sockeGelb = new Socke();

		Shirt shirtBlau = new Shirt();
		Shirt shirtRot = new Shirt();
		Shirt shirtGelb = new Shirt();

		Kleidung schublade[] = new Kleidung[6];
		schublade[0] = sockeBlau;
		schublade[1] = sockeRot;
		schublade[2] = sockeGelb;
		schublade[3] = shirtBlau;
		schublade[4] = shirtRot;
		schublade[5] = shirtGelb;

		for (int i = 0; i < schublade.length; i++) {
			schublade[i].warmHalten();
		}
	}
}

Wenn du jetzt auf „RUN“ klickst – siehst du, dass die speziellen Methoden aus der Shirt- und der „Sockenklasse“ aufgerufen werden.

Somit kannst du auf alle Instanzvariablen oder Instanzmethoden der spezielleren Kindklassen in diesem allgemeinen Array zugreifen.
Nicht schlecht, oder? 🙂

Zusammenfassung:

  • Polymorphie bedeutet, dass du spezielle Objekte anlegen und dafür allgemeinere Datentypen nutzen kannst.
  • Dadurch ist es dir möglich polymorphe Java Arrays anzulegen.
  • Durch das Feature Polymorphie bzw. Polymorphismus kannst du die strenge Typisierung von Arrays aufheben.

Ähnliche Beiträge

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

Java Exceptions Handling – Fehler- und Ausnahmenbehandlung in Java

Java Exceptions Handling

Java Exceptions Handling umfasst den richtigen Umgang mit Ausnahmen und Fehlern. Wie geht das? Und braucht man so etwas wirklich? Vielleicht sagst du jetzt: „Brauch ich nicht. Ich mache niemals Fehler.“ Doch… Bei der Java Fehlerbehandlung geht es nicht ausschließlich nur um deine Programmierfehler. Es geht auch um falsche Nutzereingaben, Hardware- und Ablauffehler. Und deshalb […]

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

Der bedeutende Unterschied zwischen Klassenvariablen und Instanzvariablen

Java Klassenvariablen

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? Instanzvariablen stehen einem Objekt zur Verfügung. […]

So legst du Utility Klassen in Java an

Java Utility Klassen

Utility Java Klassen – was ist das? Man nennt diese auch Hilfsklassen von Java. Diese Utility Klassen sind Java Klassen, welche lediglich Methoden und Konstanten anbieten. Am Beispiel: Die Klasse Math ist so eine klassische Utility Klasse. Wozu braucht man solche Klassen? Diese Klassen sind so etwas wie ein Werkzeugkoffer für jedes Java Programm. Hier […]

So erstellst du deine ersten Java Klassen mit Eclipse

Java Klassen sind Baupläne für Java Objekte. Und da Java eine objektorientierte Programmiersprache ist, sind Java Klassen somit ein elementarer Bestandteil. In diesem Beitrag möchte ich dir zeigen, wie du eine Java Klasse in Eclipse erstellen kannst. Ich möchte dir außerdem zeigen, was physikalisch in deinem Projekt passiert. Ganz zum Schluss zeige ich dir noch, […]

Das Java Leben ist einfacher mit For-Schleife

Java For Schleife Aufbau

In einem anderen Artikeln habe ich bereits über Schleifen in Java gesprochen. In diesem Artikel möchte ich dir eine ganz besondere Schleife vorstellen. Warum ist diese so toll? Sie hat einen integrierten Schleifenzähler. Die Schleife zählt also bei jedem Durchlauf automatisch mit. Aber dazu gleich mehr…. Lass uns einmal so eine For Schleife anlegen.

Die mathematischen Grundlagen des Dezimalsystems für Java Programmierer

Java Dezimalsystem Mathematik Programmierer

Bei der Java Programmierung benötigst du Kenntnisse über das Dezimalsystem. Allein schon für die technische Umsetzung beim Runden einer Zahl. Oder du möchtest den Kehrwert bzw. den Umkehrwert einer Zahl im Programm bestimmen lassen. Aber auch für das Herausfinden des Stellenwertes – also wieviel Stellen hat eine Zahl – benötigst du das Grundwissen des Dezimalsystems. […]

So implementierst du Instanzmethoden in deine Java Klasse

Java Instanzmethoden

In einen der letzten Beiträge habe ich dir gezeigt, wie du eine Klasse anlegen kannst. Ich habe die Klasse „Mensch“ oder „Human“ angelegt und wir haben die erste Instanzvariable implementiert. Dein Code sollte jetzt so aussehen: public class Human { int size=156;//size in centimeter } In diesem Beitrag werde ich dir zeigen, wie du Java […]