Kontext
Dieses Java-Beispiel stammt aus meinem eigenen Informatik-Unterricht in der gymnasialen Oberstufe und wurde dann von mir 2025 ergänzt um Erkenntnisse aus dem Buch von Lahres et al. [1].
Das Beispiel "Heterogene Liste" deckt folgende Aspekte der OOP ab:
Zielsetzung
Es soll ein Array erstellt werden, in dem Objekte verschiedener Klassen gespeichert werden können. Die entsprechenden Klassen sind Unterklassen einer gemeinsamen Oberklasse.
BlueJ-Klassendiagramm des Projekts
Hier sehen wir zunächst das BlueJ-Klassendiagramm des gessamten Projekts. Kommen wir nun zu den einzelnen Klassen.
class Punkt
Die Klasse GeoFigur
Eine klassische Java-Klasse für einen Punkt, mit dem man beispielsweise die Koordinaten eines Kreises oder Rechtecks abbilden kann. Neben der Setter-Methode setPos() und den beiden Getter-Methoden getXPos() und getYPos() gibt es noch eine Methode zum Verschieben des Punktes um einen bestimmten x- und y-Wert - verschieben() - sowie eine Methode zur Umwandlung der Koordinaten in einen String - toString().
class Geofigur
Die Klasse GeoFigur
Da zwei der vier Methoden abstrakt sind, handelt es sich um eine abstrakte Klasse. Das Anzeigen und das Löschen der jeweiligen Figur muss von den Unterklassen implementiert werden. Alle Objekte der Unterklassen besitzen aber die gleichen Instanzvariablen position, width und height, daher kann die abstrakte Klasse GeoFigur Methoden besitzen, die diese Variablen manipulieren.
Hauptmethode von GeoFigur ist verschieben(), dabei geben dx und dy die x- und y-Distanz in Pixeln an, um die die Figur auf der Zeichenfläche verschoben werden soll.
Zunächst muss aber überprüft werden, ob die Figur nicht die Zeichenfläche verlässt, wenn sie verschoben wird. Diese Aufgabe wurde in die Methode neuePositionOK() ausgelagert.
Wenn die Überprüfung der neuen Position den Wert true ergibt - weil sich die Figur nach dem Verschieben noch innerhalb der Zeichenfläche aufhält - wird das Verschieben durchgeführt. Zunächst wird die Figur gelöscht - was eine Sache der Unterklassen ist. Dann wird die Methode verschieben() der Instanzvariable position ausgeführt. Und schließlich wird die Figur an der neuen Position wieder angezeigt - ebenfalls eine Aufgabe der Unterklassen, die für die entsprechende Implementierung sorgen müssen.
Da es sich hier um keine echte Graphik-Anwendung handelt, sondern nur um eine Fallstudie zur Veranschaulichung von Vererbung, abstrakten Klassen und Überschreiben von Methoden, kann die Methode verschieben() auch einfache Fehlermeldungen auf der Konsole ausgeben.
class Kreis
Die Klasse Kreis
Kreis ist eine einfache Klasse und gleichzeitig Unterklasse von GeoFigur. Neue Instanzvariablen wurden nicht deklariert, und es wurde keine Methode von GeoFigur überschrieben. Aber die beiden abstrakten Methoden loeschen() und anzeigen() wurden implementiert. Allerdings nicht in irgendeinem Graphik-Modus, sondern ganz simpel im Konsolen-Modus - schließlich handelt es sich bei diesem Projekt nur um eine Demonstration der Polymorphie in der OOP.
class Dreieck und class Rechteck
Die beiden Klassen sehen fast genau so aus wie Kreis. Die Konstruktoren nehmen aber vier Parameter entgegen (x, y, width und height), und die Meldungen der Methoden loeschen() und anzeigen() sehen etwas anders aus.
class Quadrat
Diese Klasse ist eine Unterklasse von Rechteck; der Konstruktor nimmt nur die drei Parameter x, y und width entgegen, und die Meldungen in loeschen() und anzeigen() sehen etwas anders aus.
class TestMitArray
Die Klasse TesteMitArray
In den Zeilen 3 und 7 wird ein Array aus Objekten der Klasse GeoFigur angelegt.
Methode auffuellen()
In dieser Methode werden drei Kreis-Objekte, ein Rechteck-Objekt, ein Dreieck-Objekt und ein Quadrat-Objekt hinzugefügt. Anschließend wird die anzeigen()-Methoden der Testklasse aufgerufen.
Methode anzeigen()
In der Methode anzeigen()werden die sechs Objekte mit einer for-Schleife angezeigt, indem die anzeigen()-Methoden der Objekte aufgerufen werden.
Methode verschieben()
In dieser Methode wird jedes GeoFigur-Objekt um dx Pixel horizontal und dy Pixel vertikal verschoben. Da die verschieben()-Methoden der Unterklassen bereits selbst eine Meldung auf der Konsole anzeigen, wurde in dieser Methode auf einen System.out.println()-Befehl verzichtet.
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.