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

Java Methoden mit variabler Argumentenanzahl – VarArgs

Java Methoden mit variabler Argumentenanzahl VarArgs

Du kennst das noch. Kopfrechnen und zwar auf Zeit. So etwas ist das Standardprogramm in den Schulklassen 1 bis 5. Irgendwann, in Klasse 6 oder 7, kommt der Taschenrechner ins Spiel und Kopfrechnen ist aus dem Schulalltag gestrichen. Schade eigentlich. Dabei kann man diese Disziplin auch wunderbar in kleinen Spielen unterbringen. Ich erinnere mich noch: […]

Hier sind ein paar richtig nette Features, die dich beim Java lernen unterstützen

Java lernen Eclipse

Was ist das Wichtigste beim Einstieg in ein neues Wissensgebiet? Nein, kein gutes Sachbuch oder ein besonders guter Lehrer. Es ist Spaß. Beim Java Lernen brauchst du Spaß. Es gibt Lehrer, welche ihren Stoff so vermitteln, dass Lernen Spaß bereitet. Aber die Grundvoraussetzung ist und bleibt der Spaß. Und nichts ist so spaßhemmend wie Langeweile […]

So verwendest du den Java Oder Operator

Java Oder Operator

Kennst du das auch aus deiner Schulzeit? Du schreibst eine Klassenarbeit in irgendeinem Fach. Nehmen wir einfach mal an – Mathe. Jetzt bist gerade fertig mit deiner Arbeit. Und zu Hause wirst du gefragt: „Und wie lief es?“ Du antwortet:“ Ganz gut. Es wird bestimmt eine Eins oder eine Zwei.“ Drei oder vier Tage später […]

So kannst du mit dem StringTokenizer Java Strings zerlegen oder splitten

Java StringTokenizer Java Strings teilen zerlegen splitten

Java StringTokenizer – was ist das? Bevor ich diese Frage kläre, schiebe ich eine zweite Frage hinterher. Denn im Wort Tokenizer steckt das Wort Token. Also was ist ein Token? Hier die Definition zum Token: Ein Token ist eine bestimmte Aneinanderreihung von Zeichen. Man kann auch sagen, eine lexikalische Einheit. Das kann zum Beispiel eine […]

So kannst du gelöschte Java Projekte oder Dateien in Eclipse wieder herstellen

Wahrscheinlich passiert es jedem einmal, dass man versehentlich Dateien löscht. Und dann? Die Wut ist riesig, weil man ja alles nochmal schreiben muss. In Eclipse hast du die Möglichkeit sämtliche Dateien wieder herzustellen. In diesem Beitrag möchte ich dir demonstrieren, wie du gelöschte Java Klassen, Dateien, Projekte oder Packages wieder herstellen kannst.

Java Konsolenausgaben mit formatierten Zahlen

Java Konsolenausgaben 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 den Tausenderpunkt. Vielleicht möchtest du […]

So kannst du in den Java Klassen Attribute anlegen

Java Klassen Attribute

Die bisherigen Java Klassen in unserem Einführungsbeispiel besitzen noch keine Attribute. Das ändern wir und legen diese jetzt an. In diesem Beitrag erfährst du: Warum Variablen in deinen Klassen eine entscheidende Rolle spielen. Was es bedeutet eine Variable zu deklarieren. Wo du Attribute in den Java Klassen anlegen darfst und wo nicht. Wie du durch […]

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 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 Übung 21 – Bestimme die Anzahl der Tage

Java Übung Tage

In dieser Java Übung möchte ich, dass du eine Methode schreibst, welche zwei Zahlen entgegennimmt. Und zwar soll die erste Zahl das Jahr sein. Die zweite Zahl soll eine Monatsangabe (1-12) repräsentieren. Was soll die Methode dann machen? Die Methode soll dir die Anzahl der Tage des jeweiligen Monats zurückgeben. Achte auf Schaltjahre.