Kapitel 5 Das Projekt Bahn Seite 1

Größe: px
Ab Seite anzeigen:

Download "Kapitel 5 Das Projekt Bahn Seite 1"

Transkript

1 Kapitel 5 Das Projekt Bahn Seite 1 8 Das Projekt Bahn In diesem Kapitel möchte ich nur einen ersten Einblick in die Konzepte der Vererbung und des Polymorphismus geben. Als Motivation dient ein Zug, den der Benutzer sich aus Güterwagen, Personenwagen und Lokomotiven zusammensetzen kann. Dieser Zug kann sich bewegen und seine Geschwindigkeit vergrößern bzw. verkleinern. Abbildung 8.1: Das Projekt Bahn 8.1 Einfache Modellierung des Zugs (1. Modell) Bemerkung: In dieser ersten Modellierung werden die Grundbegriffe der Vererbung und des Polymorphismus beschrieben. Allerdings weist dieses einfache Modell noch einige Mängel auf. Diese werden dann in einer weiteren, fortgeschrittenen Modellierung behoben. Hier wird dann ein an die Realität besser angepasstes Modell vorgestellt. Ein Zug besteht aus einer Lokomotive und einer bestimmten Anzahl von Personenwagen. Bei einem Zug besitzen alle Personenwagen die gleiche Länge und die gleiche Farbe, sie haben allerdings je nach Zusammenstellung des Zugs ihre eigene x-position. Somit kannst du folgendes vorläufiges Modell der Waggons eines Zugs entwerfen.

2 Kapitel 5 Das Projekt Bahn Seite 2 Abbildung 8.2: Die Klasse Personenwagen und ein Objekt pwagen1 Abbildung 8.3: Die Klasse Lokomotive und ein Objekt lok Die Abbildungen 8.2 und 8.3 zeigen Modelle der Klasse Personenwagen und der Klasse Lokomotive mit zugehörigen Objekten. Wichtig für die Fahrt des Zugs ist, dass alle Waggons einschließlich der Lokomotive die gleiche Geschwindigkeit haben. Übung 8.1: Stelle nun schriftlich (auf einem Blatt Papier) einen Zug zusammen, der aus drei Personenwagen und einer Lokomotive besteht. Gib den Eigenschaften der Objekte vernünftige Werte. Achte auf sinnvolle Werte des Attributs x-position! Übung 8.2: Entwerfe schriftlich (auf einem Blatt Papier) das Modell eines Güterwagens. Erstelle hierzu ein UML-Diagramm der Klasse Gueterwagen und ein Objekt gwagen. Stelle nun einen Zug zusammen, der aus einer Lokomotive und mehreren Personen- und Güterwagen in beliebiger Reihenfolge besteht. Achte auf sinnvolle Werte der Attribute! Du wirst bei den obigen Übungen bemerkt haben, dass die Klassen Lokomotive, Personenwagen und Gueterwagen weitgehend ähnlich sind. Bei der

3 Kapitel 5 Das Projekt Bahn Seite 3 Implementierung dieser Klassen wirst du deswegen den Quelltext mehrmals schreiben (oder kopieren und einfügen). Werden später im Zug Tankwagen oder Doppelstockwagen verwendet, musst du wiederum Klassen mit ähnlichem Quelltext implementieren. Auch bei einer späteren Überarbeitung oder Wartung des Programms müssen Änderungen an entsprechenden Stellen all dieser Klassen vorgenommen werden. Für solche sich stark ähnelnde Klassen kennt Java das Konzept der Vererbung und der Polymorphie. Beide sind eng miteinander verbunden Vererbungshierachie des 1. Modells Vererbung ist ein Mechanismus, mit dem du das Problem der Quelltext- Duplizierung lösen kannst. Dahinter steckt die Idee, dass zuerst die Klasse Waggon definiert wird, die diejenigen Eigenschaften, die beiden Klassen Personenwagen und Lokomotive gemeinsam sind, zusammenfasst. Die spezifischen Eigenschaften des Personenwagens fügst du dann in die Klasse Personenwagen und die spezifischen Eigenschaften der Lokomotive in die Klasse Lokomotive ein. Gemeinsame Eigenschaften von Personenwagen und Lokomotive sind xposition, geschwindigkeit, laenge und farbe. Diese Attribute gehören somit in die Klasse Waggon. Nur die Attribute sitze bzw. kmstand sind spezifisch für die Personenwagen bzw. Lokomotive und werden also in den Klassen Personenwagen und Lokomotive untergebracht werden. Abbildung 8.4: Personenwagen und Lokomotive erben von Waggon Die Klasse Personenwagen erbt von der Klasse Waggon oder die Klasse Personenwagen erweitert die Klasse Waggon. Die Klasse Lokomotive erbt von der Klasse Waggon oder die Klasse Lokomotive erweitert die Klasse Waggon. Man bezeichnet die Klasse Waggon als Superklasse (Oberklasse) und die erbenden Klassen Personenwagen und Lokomotive als Subklasse (Unterklasse).

4 Kapitel 5 Das Projekt Bahn Seite 4 Die Subklasse erweitert demnach die Superklasse. Sie erhält alle Eigenschaften der Superklasse und besitzt zusätzlich ihre speziellen Eigenschaften. In Java wird für die Erweiterung einer Superklasse zur Subklasse das Schlüsselwort extends (engl.: erweitern) verwendet. Für die Vererbungsbeziehung werden üblicherweise Pfeile mit nicht gefüllten Pfeilspitzen verwendet. In BlueJ wird diese Klassenbeziehung folgendermaßen bildlich dargestellt: Abbildung 8.5: Klassendiagramm in BlueJ Datenfelder in Super- und Subklassen Du wirst nun die Beziehung zwischen den Datenfeldern von Super- und Subklasse untersuchen. Übung 8.3: Erzeuge in BlueJ ein neues Projekt Bahn01a. Implementiere die drei Klassen Waggon mit den Datenfeldern xposition, geschwindigkeit, laenge, farbe Personenwagen mit dem Datenfeld sitze Lokomotive mit dem Datenfeld kmstand Ordne im Klassendiagramm diese Klassen wie in Abbildung 8.5 dargestellt. Die Pfeile fehlen noch!

5 Kapitel 5 Das Projekt Bahn Seite 5 Nun wirst du die beiden Klassen Personenwagen und Lokomotive als Subklassen der Superklasse Waggon auszeichnen. Diese Vererbungsbeziehung wird durch das Schlüsselwort extends definiert. Die Klasse Personenwagen ist somit eine Subklasse der Klasse Waggon. Die Klasse Personenwagen enthält nur die Datenfelder, die spezifisch sind für Personenwagen-Objekte (hier sitze). Die anderen Datenfelder werden von der Superklasse Waggon geerbt und brauchen nicht erneut aufgelistet werden. import java.awt.*; public class Personenwagen extends Waggon private int sitze; // Konstruktor und Methoden hier ausgelassen import java.awt.*; public class Lokomotive extends Waggon private int kmstand; // Konstruktor und Methoden hier ausgelassen Abbildung 8.6: Die Subklassen Personenwagen und Lokomotive Auch die Klasse Lokomotive weist sich durch das Schlüsselwort extends als Subklasse aus und enthält nur Datenfelder, die spezifisch sind für Lokomotive- Objekte. Übung 8.4: Definiere im Projekt Bahn01a die Klassen Personenwagen und Lokmotive als Subklassen. Vergleiche dazu die Abbildung 8.5. Erzeuge nun Objekte der einzelnen Klassen und untersuche diese mit Hilfe des Inspektors Konstruktor in Super- und Subklassen Die Objekte müssen bei ihrer Erzeugung in einen vernünftigen Zustand versetzt werden. Das bedeutet, den Datenfeldern dieser Objekte musst du sinnvolle Werte zuweisen. Verantwortlich dafür ist der Konstruktor. Bei der Erzeugung eines Personenwagens werden den Datenfeldern entsprechende Werte übergeben. Jedoch sind einige Datenfelder in der

6 Kapitel 5 Das Projekt Bahn Seite 6 Superklasse Waggon, andere in der Subklasse Personenzug bzw. Lokomotive. All diese Datenfelder musst du nun korrekt initialisieren. Obwohl du kein Objekt der Klasse Waggon erzeugen willst (in Java gibt es die Möglichkeit, dies auch wirklich zu verhindern), erhält diese Klasse einen Konstruktor. In diesem wird den Datenfeldern xposition und geschwindigkeit jeweils der Wert 0 zugewiesen. Somit erhalten alle Waggons, in diesem Fall also alle Personenwagen und alle Lokomotiven die gleiche xposition und die gleiche Geschwindigkeit. Bemerkung: Bei der späteren Zusammenstellung der Waggons in einem Zug wird der Wert von xposition wieder geändert. Somit mag diese Zuweisung im Konstruktor nicht sinnvoll sein, zumal hier sowieso der Standardwert zugeordnet wird. Jedoch aus didaktischen Gründen habe ich mich entschlossen, auch in der Superklasse einen Konstruktor einzuführen, um das Zusammenspiel zwischen den Konstruktoren von Super- und Subklassen zu verdeutlichen. import java.awt.*; public class Waggon private int xposition, geschwindigkeit, laenge; private Color farbe; public Waggon() xposition = 0; geschwindigkeit = 0; Abbildung 8.7: Konstruktor der Superklasse Waggon Analog erhalten auch die beiden Subklassen jeweils einen Konstruktor. import java.awt.*; public class Personenwagen extends Waggon private int sitze; public Personenwagen() super(); laenge = 60 farbe = Color.blue; sitze = 50;

7 Kapitel 5 Das Projekt Bahn Seite 7 Abbildung 8.8: Konstruktor der Subklasse Personenwagen In Java muss im Konstruktor einer Subklasse immer als erste Anweisung der Konstruktor der Superklasse mit Hilfe des Schlüsselworts super aufgerufen werden. Wenn also ein Personenwagen erzeugt wird, dann wird der Konstruktor von Personenwagen aufgerufen. In diesem bewirkt das Schlüsselwort super den Aufruf des Konstruktors der Superklasse Waggon. Dieser Konstruktor in Waggon initialisiert die Datenfelder xposition und geschwindigkeit. Anschließend wird wieder in den Konstruktor von Personenwagen zurückgekehrt, der die restlichen Datenfelder laenge, farbe und sitze in der Klasse Personenwagen initialisiert Analog implementierst du in der Subklasse Lokomotive den Konstruktor. import java.awt.*; public class Lokomotive extends Waggon private int kmstand; public Lokomotive() super(); laenge = 40; farbe = Color.black; kmstand = 0; Abbildung 8.9: Konstruktor der Subklasse Lokomotive Übung 8.5: Implementiere die Konstruktoren der Superklasse Waggon und der beiden Subklassen Personenwagen und Lokomotive. Kompiliere das Projekt Bahn01a! Versuche die Fehlermeldung zu erklären. Abbildung 8.10: Fehlermeldungen in den Subklassen

8 Kapitel 5 Das Projekt Bahn Seite 8 Beim Kompilieren erscheint die Fehlermeldung laenge has private access in Waggon. Offensichtlich kannst du von der Subklasse aus nicht auf die Datenfelder der Superklasse zugreifen. In der Superklasse Waggon ist das Datenfeld laenge als private erklärt und deshalb für alle anderen Klassen inklusive Subklassen nicht zugreifbar. Die Verwendung des Schlüsselworts protected eröffnet eine Möglichkeit, auf die Datenfelder der Superklasse zuzugreifen. Die Zugriffsstufe protected liegt zwischen dem privaten Zugriff und der öffentlichen Verfügbarkeit. Datenfelder und Methoden, die als protected deklariert sind, können innerhalb der Klasse selbst und von allen Subklassen benutzt werden, aber nicht von anderen Klassen. Bemerkung: Barnes und Kölling empfehlen, das Schlüsselwort protected nur bei Konstruktoren und Methoden zu verwenden, da eine Verwendung bei Datenfeldern die Kapselung schwächen würde. Veränderbare Datenfelder in Superklassen sollten private bleiben. Um trotzdem auf diese Datenfelder zugreifen zu können, müssten weitere sondierende und verändernde Methoden implementiert werden. Die Subklassen können dann diese Methoden verwenden, um die Attribute auszulesen und zu verändern. Ich habe hier auf diese Möglichkeit verzichtet, um den Quelltext für die Schüler knapp zu halten. import java.awt.*; public class Waggon private int xposition; protected int laenge; protected Color farbe; public Waggon() xposition = 0; geschwindigkeit = 0; Abbildung 8.11: Quelltext der Superklasse Waggon Übung 8.6: Verändere die Zugriffstufe der Datenfelder wie in Abbildung 8.11 dargestellt. Erzeuge Objekte von allen drei Klassen und untersuche diese mit dem Inspektor. Überlege, welche Objekte sinnvoll sind!

9 Kapitel 5 Das Projekt Bahn Seite 9 Übung 8.7: Erzeuge eine weitere Subklasse Gueterwagen mit den Datenfeldern laenge = 80, farbe = grün und flaeche = Abstrakte Klassen Die Klasse Waggon besitzt einen Konstruktor, obwohl es eigentlich überflüssig ist, direkt ein Objekt der Klasse Waggon zu erzeugen. In Übung 8.6 konntest du ausprobieren, ob sich wirklich ein Objekt der Klasse Waggon erzeugen lässt. Dies ist jedoch nicht sinnvoll. Klassen, von denen keine Objekte erzeugt werden sollen, heißen abstrakte Klassen. Sie dienen ausschließlich als Superklassen für andere Klassen. Solche Klassen werden als abstrakt deklariert, indem das Schlüsselwort abstract in der Kopfzeile der Klasse angegeben wird. Übung 8.8: Ersetze die Kopfzeile public class Waggon der Klasse Waggon durch abstract public class Waggon. Betrachte die Veränderungen im Klassendiagramm von BlueJ. Versuche Objekte der Superklasse Waggon zu erzeugen. Versuche Objekte der Subklassen Gueterwagen, Personenwagen und Lokomotive zu erzeugen. Verwende den Inspektor! Abbildung 8.12: Superklasse Waggon wird als abstract erklärt

10 Kapitel 5 Das Projekt Bahn Seite 10 Wird also die Superklasse Waggon als abstract erklärt, wird verhindert, dass du unbeabsichtigt von dieser Klasse Objekte erzeugen könntest. Auf die Subklassen Gueterwagen, Personenwagen und Lokomotive hat dieses keinen Einfluss Methoden in Super- und Subklassen Nun wirst du die Klassen mit Leben füllen. Der Zug, der nun aus mehreren Güter- und Personenwagen und einer Lokomotive zusammengesetzt ist, soll nun fahren. Der Inspektor jedes einzelnen Waggons zeigt jedoch, dass zum Zeitpunkt der Erzeugung ihre Geschwindigkeiten jeweils den Wert 0 haben. Somit musst du in der Klasse Waggon eine Methode beschleunigen() implementieren, die die Geschwindigkeit jedes einzelnen Waggons vergrößert. /** Vergroessert die Geschwindigkeit des Waggons um 1. */ public void beschleunigen() geschwindigkeit += 1; Abbildung 8.13: Die Methode beschleunigen() in der Superklasse Waggon Jetzt kannst du zwar die Geschwindigkeit der Waggons vergrößern, jedoch müssen sich alle Waggons des Zugs um eine bestimmte Strecke bewegen. In diesem einfachen 1. Zugmodell ist der Wert dieser Strecke gleich dem Wert der Geschwindigkeit. Wenn also die Waggons die Geschwindigkeit 2 besitzen, so sollen sich diese um 2 nach rechts bewegen. Da diese Fähigkeit alle Waggons betrifft, ist es sinnvoll, die entsprechende Methode bewegen() in der Superklasse Waggon zu implementieren. /** Bewegt den Waggon auf die neue x-position. */ public void bewegen() xposition += geschwindigkeit; Abbildung 8.14: Die Methode bewegen() in der Superklasse Waggon

11 Kapitel 5 Das Projekt Bahn Seite 11 Abbildung 8.15: Klassendiagramm von Bahn01 mit Aufruf der Methoden bewegen(), beschleunigen() und bremsen() Die Abbildung 8.15 zeigt in der Objektleiste im Prinzip bereits einen Zug, der aus einem Güterwagen, zwei Personenwagen und einer Lokomotive sich zusammensetzt. Wenn du bei jedem Waggon die Methode bewegen() aufrufst, so hat sich der gesamte Zug um den Wert von geschwindigkeit in die neue xposition bewegt. Übung 8.9: Implementiere die Methoden beschleunigen() und bewegen() in der Superklasse Waggon. Kompiliere das Projekt Bahn01a. Überprüfe diese mit dem Inspektor. Beschleunige einen Waggon und bewege diesen auf die entsprechende xposition Implementiere auch eine Methode bremsen(). Übung 8.10: Implementiere Methoden, die die Ladefläche eines Güterwagens, die Anzahl der Sitze eines Personenwagens und den Kilometerstand einer Lokomotive liefern. Untersuche mit Hilfe des Inspektors die Objekte der Klassen Gueterwagen, Personenwagen und Lokomotive. Erarbeite deren Gemeinsamkeiten und deren Unterschiede. Die Abbildung 8.16 zeigt deine bisherige Modellierung der Waggons, aus denen der Zug nun zusammengestellt wird.

12 Kapitel 5 Das Projekt Bahn Seite 12 Abbildung 8.16: Modellierung der Waggons Der Zug wird zusammengestellt Nun wirst du aus allen Waggons einen Zug zusammenstellen. Hierzu wird die Klasse Zug verwendet, in der mit Hilfe der Methode anhaengen() diese Waggons in einer Liste zusammengefasst werden. Interessant ist nun, wie die Objekte der verschiedenen Klassen Gueterwagen, Personenwagen und Lokomotive in eine gemeinsame Liste waggonliste untergebracht werden. Hier hilft wieder die Technik der Vererbung. All diese Klassen haben von der Superklasse Waggon geerbt. Du sammelst also in der Sammlung waggonliste Objekte vom Typ Waggon. Diese Sammlung weiß dann sozusagen selbst, ob dieser Waggon aus der Subklasse Gueterwagen, Personenwagen bzw. Lokomotive ist. Abbildung 8.17 zeigt den Quelltext der Klasse Zug. import java.util.*; public class Zug private ArrayList<Waggon> waggonliste; public Zug() waggonliste = new ArrayList<Waggon>(); /** Haengt den neuen Waggon an. */ public void anhaengen(waggon waggon) waggonliste.add(waggon);

13 Kapitel 5 Das Projekt Bahn Seite 13 Abbildung 8.17: Quelltext der Klasse Zug Die Methode anhaengen() erwartet als Parameter kein Objekt der Subklassen Gueterwagen, usw., sondern ein Objekt der Superklasse Waggon. Du weißt nun, dass Klassen Subklassen haben können. Objekte von Subklassen können an allen Stellen verwendet werden, an denen Objekte vom Typ ihrer Superklassen erwartet werden. Denn ein Objekt einer Subklasse ist nur ein spezielles Objekt der Superklasse. Umgekehrt klappt dies nicht! Deswegen funktioniert auch die obige Parameterübergabe. Du darfst also ein Objekt vom Typ Lokomotive an eine Methode anhaengen() übergeben, die einen Parameter vom Typ Waggon erwartet. Deshalb benötigst du auf Grund dieser Subtyp-Regel nur eine Methode (mit einem Parameter vom Typ Waggon), um Güterwagen, Personenwagen oder auch Lokomotiven erfassen zu können. In einer objektorientierten Programmiersprache darfst du, wenn ein Objekt einer Superklasse erwartet wird, dieses durch ein Objekt einer Subklasse ersetzen. Abbildung 8.18: Klassendiagramm des Projekts Bahn01b

14 Kapitel 5 Das Projekt Bahn Seite 14 Übung 8.11: Speichere dein Projekt Bahn01a unter dem Namen Bahn01b. Implementiere im Projekt Bahn01b der Klasse Zug aus Abbildung 8.17 a) Erzeuge nun die Objekte wie in Abbildung 8.18 und erstelle den Zug mit Hilfe der Methode anhaengen(). b) Überprüfe mit Hilfe des Inspektors, ob der Zug alle Waggons besitzt. Vergleiche dazu die Abbildung Abbildung 8.19: Der Inspektor des Objekts zug1 Variablen für Objekttypen sind in Java polymorphe Variablen. Polymorph bedeutet vielgestaltig. In diesem Sinn kann eine Variable Objekte von verschiedenen Typen halten, nämlich den deklarierten Typ dieser Variablen und den Subtyp dieses deklarierten Typs. Da nun die Reihenfolge der Waggons im Zug festgelegt ist, kannst du jetzt auch die xposition (das ist der jeweils linke Rand) jedes einzelnen Waggons berechnen. In Übung 8.2 hast du auf einem Blatt Papier bereits einen Zug zusammengestellt. Für die Berechnung der jeweiligen xposition benötigst du die Länge der einzelnen Waggons und einen gewissen Abstand (bei mir gleich 2)

15 Kapitel 5 Das Projekt Bahn Seite 15 zwischen den Waggons. Abbildung 8.20 zeigt, wie du aus der Länge eines Waggons und dessen Position im Zug die entsprechende xposition ermitteln kannst. Abbildung 8.20: Ermittlung der xposition jedes einzelnen Waggons Der Zug ist also verantwortlich für die Berechnung der x-positionen seiner Waggons. Jeder Waggon liefert dem Zug seine Länge und der Zug errechnet hieraus die entsprechende x-position. Anschließend holt sich der Waggon diese x-position und speichert sie in seinem Datenfeld xposition. Übung 8.12: Implementiere in der Klasse Waggon a) die Methode giblaenge(), die die jeweilige Länge des Waggons liefert, b) die Methode holexposition(), die die berechnete x-position in das Datenfeld xposition schreibt. Die Berechnung der x-position jedes einzelnen Waggons erfolgt in der Klasse Zug. In der Methode anhaengen() wird die jeweilige Waggonposition dem gerade neu angehängten Waggon übergeben und anschließend gleich die neue Waggonposition für den nächsten Waggon berechnet. Dazu musst du eine Konstante ABSTAND = 2 und ein neues Datenfeld waggonposition in der Klasse Zug deklarieren. final static int ABSTAND = 2; private int waggonposition; private ArrayList<Waggon> waggonliste; weitere Anweisungen public void anhaengen(waggon waggon) waggonliste.add(waggon); waggon.holexposition(waggonposition); //berechnet xposition des naechsten Waggons waggonposition += ABSTAND + waggon.giblaenge();

16 Kapitel 5 Das Projekt Bahn Seite 16 Abbildung 8.21: Die Methode anhaengen() in der Klasse Zug Übung 8.13: Implementiere in der Klasse Zug die Methode anhaengen(). Nun stelle wie in Übung 8.11 einen Zug zusammen und überprüfe mit Hilfe des Inspektors die x-positionen der entsprechenden Waggons wie in Abbildung 8.20 dargestellt Der Zug fährt Nachdem du den Zug aus verschiedenen Waggons zusammengesetzt hast, sollte dieser nun auch fahren. Du musst also zuerst die Geschwindigkeit eines jeden Waggons vergrößern (diese hat zurzeit den Wert 0) und anschließend die Waggons bewegen. Dazu besitzt jeder Waggon bereits die Methoden beschleunigen() und bewegen(). Die Klasse Zug muss also nur noch alle Waggons in der waggonliste der Reihe nach durchlaufen und deren entsprechende Methoden aufrufen. /** Der gesamte Zug vergroessert seine Geschwindigkeit. */ public void vergroesseregeschw() for (Waggon waggon : waggonliste) waggon.beschleunigen(); /** Der gesamte Zug faehrt gleichmaessig. */ public void fahren() for (Waggon waggon : waggonliste) waggon.bewegen(); Abbildung 8.22: Die Methoden vergroesseregeschw() und fahren() in der Klasse Zug Zum Durchlaufen der waggonliste wird eine for-each-schleife verwendet. Hier wird eine Schleifenvariable waggon vom Typ Waggon deklariert, die dann nacheinander für alle Elemente der Sammlung waggonliste verwendet wird. Übung 8.14:

17 Kapitel 5 Das Projekt Bahn Seite 17 Implementiere die Methoden vergroesseregeschw() und fahren() in der Klasse Zug. Überprüfe mit Hilfe des Inspektors, ob sich bei allen Waggons im Zug die xposition korrekt vergrößert. Implementiere nun eine Methode verringeregeschw(). Die Abbildung 8.23 zeigt deine bisherige Modellierung des Zugs, der aus drei verschiedenen Waggontypen zusammengestellt werden kann. Abbildung 8.23: Modellierung des Zugs (1. Modell) Das bisher beschriebene Modell des Zugs weist einige Mängel auf. Den schwerwiegendsten Mangel zeigt folgende Übung. Übung 8.15: Erstelle im Projekt Bahn01b einen Zug, der keine Lokomotive besitzt. Überprüfe, ob dieser Zug auch ohne Lokomotive fahren kann. Bemerkung: Um diese Mängel zu beseitigen, wirst du später eine fortgeschrittene Modellierung des Zuges kennen lernen. Hier wird dann ein an die Realität besser angepasstes Modell vorgestellt. Vorläufig wird jedoch mit diesem ersten. Modell des Zuges weitergearbeitet.

18 Kapitel 5 Das Projekt Bahn Seite Die grafische Oberfläche Bemerkung: Das Erstellen einer grafischen Oberfläche soll in diesem Kapitel nicht im Vordergrund stehen, es würde zu sehr vom eigentlichen Ziel der Vererbung wegführen. Deswegen habe ich bereits alle notwendigen Anweisungen in der Klasse BahnGUI_1 implementiert, einige davon musst du allerdings noch auskommentieren. Die grafische Benutzeroberfläche ist weitgehend bereits vorbereitet. Ich habe diese in zwei größere Panels eingeteilt: das Einstellungspanel einstellungp, das die Buttons zur Zusammenstellung des Zugs und zur Bewegung des Zugs enthält, und das Darstellungspanel darstellungp, das die Bühne für den Zug und dessen Fahrt darstellt. Abbildung 8.24: Die vorbereitete grafische Oberfläche von BahnGUI_1 Das Projekt BahnGUI_1 enthält bereits die Klassen Ansicht und Buehne. Die Klasse Ansicht erzeugt die in Abbildung 8.24 dargestellte Benutzeroberfläche. Sie enthält a) die Zeichenfläche, in der der Zug dargestellt werden soll, b) Buttons, Textfelder und die dafür notwendigen Methoden, von denen zum jetzigen Zeitpunkt viele noch auskommentiert sind.

19 Kapitel 5 Das Projekt Bahn Seite 19 Die Klasse Buehne dient zur bildlichen Darstellung des Zugs. Sie enthält zum jetzigen Zeitpunkt bereits die Methode paintcomponent(), die den oben abgebildeten schwarzen Elementarwaggon zeichnet, der später durch die entsprechenden Objekte ersetzt wird. Übung 8.16: Hole vom Schulserver das Projekt BahnGUI_1. Speichere dieses unter dem Namen Bahn02. Vergleiche dazu die Abbildung Füge mit Hilfe von Edit > Add Class from File die Klassen Zug, Waggon, Lokomotive, Personenwagen und Gueterwagen in das Projekt Bahn02 hinzu Zeichnen des Zugs Du musst dir nun überlegen, was alles in der Klasse Ansicht passiert, wenn der Benutzer auf den Button Personenwagen drückt. 1. Das Objekt pwagen der Klasse Personenwagen wird erzeugt. 2. Dieses Objekt pwagen wird an den Zug angehängt: zug.anhaengen(). 3. Damit die Klasse Buehne nun alle Waggons des Zugs zeichnen kann, muss a) die Klasse Zug eine Liste aller Waggons liefern: gibwaggonliste() b) die Klasse Buehne diese Liste aller Waggons sich holen: holewaggonliste(), c) um nun diese Liste der Reihe nach zu durchlaufen und somit die Waggons auch bildlich darstellen: zeichne() Du siehst, es gibt einiges zu tun. Am besten, du fängst mit dem letzten Punkt 3c) an. In der Klasse Buehne wird die Methode paintcomponent()implementiert: /** Zeichnet den Zug mit allen Waggons. */ public void paintcomponent(graphics g) for (Waggon waggon : waggonliste) waggon.zeichne(g); Abbildung 8.25: Die Methode paintcomponent() in der Klasse Buehne Hier wird also die Waggonliste durchlaufen. Jeder einzelne Waggon muss sich nun selbst zeichnen. Vorläufig sollen all diese Waggons nur aus einem Rechteck

20 Kapitel 5 Das Projekt Bahn Seite 20 und den beiden Rädern bestehen. Somit erhält die Klasse Waggon die Methode zeichne(). /** Zeichnet die allgemeine Form des Waggons. */ public void zeichne(graphics g) g.setcolor(farbe); g.fillrect(xposition, yposition, laenge, hoehe); //Kasten g.filloval(xposition+5, yposition+hoehe, 7, 7); //Hinterrad g.filloval(xposition+(laenge-12), yposition+hoehe, 7, 7); //Vorderrad Abbildung 8.26: Die Methode zeichne() in der Klasse Waggon Übung 8.17: a) Ersetze in der Klasse Buehne die Methode paintcomponent() durch die in Abbildung 8.25 vorgeschlagene. b) Implementiere in der Klasse Waggon die Methode zeichne(). Weiterhin werden die Datenfelder yposition und hoehe benötigt, die im Konstruktor initialisiert werden. public Waggon() xposition = 0; yposition = 100; hoehe = 30; geschwindigkeit = 0; Nun werden die Punkte 3a) und 3b) abgearbeitet. Die Klasse Zug besitzt die Sammlung aller Waggons, aus denen der Zug zusammengestellt wurde. Diese Liste muss die Klasse Zug nun liefern können. /** Liefert die Waggonliste. */ public ArrayList<Waggon> gibwaggonliste() return waggonliste; Abbildung 8.27: Die Methode gibwaggonliste() in der Klasse Zug Die Klasse Buehne, die verantwortlich für das Zeichnen des Zuges ist, holt sich anschließend diese Liste aller Waggons. /** Holt sich die Waggonliste. */ public void holewaggonliste(arraylist<waggon> waggonlisteh)

21 Kapitel 5 Das Projekt Bahn Seite 21 waggonliste = waggonlisteh; Abbildung 8.28: Die Methode holewaggonliste() in der Klasse Buehne Übung 8.18: Implementiere in der Klasse Zug die Methode gibwaggonliste() und in der Klasse Buehne die Methode holewaggonliste(). Zum Schluss musst du noch die beiden Punkte 1 und 2 bearbeiten. /** Reagiert auf Druecken des Buttons Personenwagen. */ public void personenwagenaction() pwagen = new Personenwagen(); zug.anhaengen(pwagen); zeichnezug(); Abbildung 8.29: Die Methode personenwagenaction() in der Klasse Ansicht Hier wird also ein Objekt pwagen der Klasse Personenwagen erzeugt und anschließend mit Hilfe der Methode zug.anhaengen() an den Zug angehängt. Übung 8.19: Entferne nun in der Klasse Ansicht alle Auskommentierungen außer diejenigen, die zur Bewegung des Zugs benötigt werden. Implementiere die Methode personenwagenaction() aus Abbildung 8.29 in der Klasse Ansicht. Implementiere auch die Methoden gueterwagenaction() und lokomotiveaction() in der Klasse Ansicht. Nach dem Kompilieren solltest du ein Klassendiagramm wie in Abbildung 8.30 und eine Oberfläche wie in Abbildung 8.31 erhalten.

22 Kapitel 5 Das Projekt Bahn Seite 22 Abbildung 8.30: Klassendiagramm des Projekts Bahn02 Abbildung 8.31: Vorläufige Oberfläche des Projekts Bahn02 Vielleicht gefällt dir der Zug in Abbildung 8.1 etwas besser. Aber für den Anfang sieht er doch gar nicht so übel aus Bewegen des Zugs Nun wirst du dem Zug das Fahren beibringen. In der Klasse Zug hast du bereits die Methoden vergroesseregeschw(), verringeregeschw() und fahren()

23 Kapitel 5 Das Projekt Bahn Seite 23 implementiert. Diese Methoden müssen nun von der Klasse Ansicht verwendet werden. Im Konstruktor der Klasse Ansicht wird die Methode bewegen() aufgerufen. Diese startet den Timer, der im Konstruktor der Klasse Ansicht erzeugt wurde und alle 50 ms ein Signal sendet, d.h. er ruft alle 50 ms die Methode timeran() auf. In dieser Methode bewegt sich der gesamte Zug nach rechts. Anschließend wird der Zug in der neuen Position auf der Bühne gezeichnet. Allerdings hat zu Beginn das Datenfeld geschwindigkeit noch den Wert 0, der Zug wird also immer auf derselben Position gezeichnet. Klickt der Benutzer auf den Button mit dem Rechtspfeil, so registriert dieser Button das Ereignis und ruft die Methode beschleunigenaction() auf. Diese verwendet nun die entsprechende Methode vergroesseregeschw() in der Klasse Zug.. /** Reagiert auf Druecken des Buttons Beschleunigen (-->). */ public void beschleunigenaction() zug.vergroesseregeschw(); Abbildung 8.32: Die Methode beschleunigenaction() in der Klasse Ansicht Nun kann der Zug auf der Oberfläche nach rechts fahren. Übung 8.20: Entferne nun in der Klasse Ansicht alle Auskommentierungen, die auch zur Bewegung des Zugs benötigt werden. Implementiere auch die Methoden beschleunigenaction() in der Klasse Ansicht. Überprüfe, ob der Zug mit verschiedenen Geschwindigkeiten nach rechts fahren kann. Implementiere auch eine Methode bremsenaction(). 8.3 Individuelle Gestaltung der Waggons In diesem letzten Abschnitt über das einfache Zugmodell wirst du nun die Waggons je nach Klasse etwas individueller zeichnen darstellen Darstellung von Einzelheiten Abbildung 8.1 zeigt, dass alle Güterwagen Kohle geladen haben, alle Personenwagen Fenster besitzen und die Lokomotive zusätzlich noch einen

24 Kapitel 5 Das Projekt Bahn Seite 24 Schornstein hat. Hierzu werden wieder die Konzepte der Vererbung aufgegriffen. Übung 8.21: Speichere dein Projekt Bahn02 unter dem Namen Bahn03. Anschließend überlege dir, was die Methode paintcomponent() in der Klasse Buehne eigentlich macht. Verfolge genau die Methodenaufrufe zurück, allerdings ist die Sache sehr verzwickt. Der Aufruf waggon.zeichne() in der Methode paintcomponent() der Klasse Zugbild ist noch viel verzwickter als du ahnst. Dazu musst du den Mechanismus der Methodensuche genau verstehen, um deine Waggons später individueller gestalten zu können. Eigentlich fängt alles in der Klasse Zug an. Hier werden deine Güterwagen, Personenwagen und Lokomotive mit Hilfe der Methode anhaengen() zu einem Zug zusammengesetzt. /** Haengt den neuen Waggon an. */ public void anhaengen(waggon waggon) waggonliste.add(waggon); waggon.holexposition(waggonposition); //berechnet xposition des naechsten Waggons waggonposition += ABSTAND + waggon.giblaenge(); Abbildung 8.33: Die Methode anhaengen() in der Klasse Zug Erinnere dich, der Parameter waggon dieser Methode ist eine polymorphe (vielgestaltige) Variable. In diesem Sinn kann diese Variable Objekte von verschiedenen Typen halten, nämlich den deklarierten Typ dieser Variablen und den Subtyp dieses deklarierten Typs. Du sammelst also in der Liste waggonliste Objekte vom Typ Waggon. Diese Liste weiß dann sozusagen selbst, ob dieser Waggon aus der Subklasse Gueterwagen, Personenwagen bzw. Lokomotive ist. Nun zurück zur Methode paintcomponent() der Klasse Buehne. /** Zeichnet den Zug mit allen Waggons. */ public void paintcomponent(graphics g) for (Waggon waggon : waggonliste) waggon.zeichne(g); Abbildung 8.34: Die Methode paintcomponent() in der Klasse Buehne

25 Kapitel 5 Das Projekt Bahn Seite 25 Wie Abbildung 8.1 zeigt, ist das erste Element in dieser Liste ein Güterwagen. In der Variablen waggon ist also nicht ein Objekt der Klasse Waggon enthalten (dies geht sowieso nicht, da die Klasse Waggon als abstract erklärt wurde), sondern ein Objekt der Klasse Gueterwagen. Der Aufruf waggon.zeichne() startet nun eine Suche nach einer Methode zeichne() bei einem Güterwagen. Abbildung 8.35 zeigt den Mechanismus dieser Methodensuche. Abbildung 8.35: Die Methode zeichnen() befindet sich in der Superklasse 1. Die Klasse Gueterwagen des Objekts gwagen wird gefunden. 2. In der Klasse Gueterwagen wird keine Methode zeichne() gefunden. 3. Weil keine passende Methode gefunden wird, wird die Superklasse Waggon nach einer passenden durchsucht. 4. Die Methode zeichne() wird in der Superklasse Waggon gefunden und ausgeführt. Analoges erfolgt auch bei den Objekten der Klasse Personenwagen und Lokomotive. Deshalb haben alle Waggons des Zugs bis auf Farbe und Länge das gleiche Aussehen. Nun kannst du versuchen, den Schornstein und das Fenster der Lokomotive zu zeichnen. /** Zeichnet die speziellen Formen der Lokomotive. */ public void zeichne(graphics g) g.fillrect(xposition+25, yposition-15, 10, 15); //Schornstein g.setcolor(color.lightgray);

26 Kapitel 5 Das Projekt Bahn Seite 26 g.fillrect(xposition+10, yposition+10, 10, 10); //Fenster Abbildung 8.36: Die Methode zeichne() in der Klasse Lokomotive Übung 8.22: Implementiere die Methode zeichne() aus Abbildung 8.36 in der Klasse Lokomotive. Du musst auch einigen Datenfeldern der Superklasse Waggon eine andere Zugriffsstufe zuweisen. Erstelle nun einen Zug aus zwei Güterwagen, zwei Personenwagen und einer Lokomotive. Versuche dieses Ergebnis zu erklären. Abbildung 8.37: Lokomotive hat nur Schornstein und Fenster Du musst auch hier den Mechanismus der Methodensuche verstehen. Abbildung 8.38: Die Methode zeichne() befindet sich in der Subklasse 1. Die Klasse Lokomotive des Objekts lok wird gefunden. 2. Die Implementierung der Methode zeichne() wird in der Subklasse Lokomotive gefunden und ausgeführt. 3. Somit gelangt man nie zur Methode zeichne() der Superklasse Waggon. Diese Methode wurde überschrieben.

27 Kapitel 5 Das Projekt Bahn Seite 27 Nun hast du verstanden, warum die Lokomotive ohne Rumpf und Räder gezeichnet wird. Damit auch der Rumpf und die Räder gezeichnet werden, könntest du natürlich die entsprechenden Anweisungen aus der Superklasse Waggon in die Subklasse Lokomotive verschieben. Aber diese Anweisungen müsstest du dann zusätzlich auch in die Klassen Personenwagen und Güterwagen verschieben. Sinnvoll ist das nicht! Das Konzept der Vererbung liefert hier einen Ausweg. Mit einem super-aufruf, den du bereits im Zusammenhang mit Konstruktoren verwendet hast, kannst du auf die Methode zeichne() in der Superklasse zugreifen. /** Zeichnet die speziellen Formen der Lokomotive. */ public void zeichne(graphics g) super.zeichne(g); g.fillrect(xposition+25, yposition-15, 10, 15); //Schornstein g.setcolor(color.lightgray); g.fillrect(xposition+10, yposition+10, 10, 10); //Fenster Abbildung 8.39: Verwendung des Aufrufs super in der Subklasse Lokomotive Wird nun ein Lokomotive-Objekt aufgerufen, wird zuerst die Methode zeichne() aus der Subklasse Lokomotive ausgeführt. In der ersten Anweisung ruft diese Methode mit dem super-aufruf die Methode zeichne() der Superklasse Waggon auf, die nun den Rumpf und die Räder zeichnet. Wenn der Kontrollfluss aus der Superklasse zurückkehrt, werden die restlichen Anweisungen in der Methode der Subklasse abgearbeitet und nun der Schornstein und das Fenster gezeichnet. Übung 8.23: Implementiere die Methode zeichne() aus Abbildung 8.39 in der Klasse Lokomotive. Vergleiche das Ergebnis mit Abbildung Abbildung 8.40: Lokomotiv wird nun vollständig gezeichnet Übung 8.24: Nun solltest du auch die Güterwagen und die Personenwagen gestalten. Abbildung 8.41 zeigt eine Möglichkeit.

28 Kapitel 5 Das Projekt Bahn Seite 28 Abbildung 8.41: Eine mögliche Gestaltung des Zugs Darstellung durch ImageIcons Bisher hast du die einzelnen Waggons gezeichnet. Eine andere Möglichkeit zur Darstellung der Waggons ist die Verwendung von ImageIcons. Abbildung 8.42 zeigt eine Möglichkeit, auf der grafischen Benutzeroberfläche solche ImageIcons zu verwenden. Mehrere solche jpg-bilder befinden sich im Ordner Bilder, der im Projekt BahnGUI_1 mitgeliefert wird. Abbildung 8.42: Zur Darstellung der Waggons werden ImageIcons verwendet Als Basis zur Darstellung des Zugs durch ImageIcons verwendest du dein Projekt Bahn02. Einige Änderungen musst du durchführen in der Klasse Buehne, in der Superklasse Waggon und in den Subklassen Lokomotive, Personenwagen und Gueterwagen. Da die Klasse ImageIcon im Pakat javax.swing definiert ist, musst du in all diesen Klassen das Paket javax.swing.* importieren. Übung 8.25: Speichere dein Projekt Bahn02 unter dem Namen Bahn04. Führe nun nacheinander die folgenden Änderungen durch.

29 Kapitel 5 Das Projekt Bahn Seite 29 Die Klasse Buehne muss nun ImageIcons auf die Zeichenfläche malen. Hierzu wird die Methode paintcomponent() ersetzt durch /** Zeichnet den Zug mit allen Waggons. */ public void paintcomponent(graphics g) for (Waggon waggon : waggonliste) ImageIcon icon = waggon.gibicon(); int xposition = waggon.gibxposition(); if (icon!= null) icon.painticon(this, g, xposition, 100); Abbildung 8.43: Die Methode paintcomponent() in der Klasse Buehne Von jedem Waggon aus der waggonliste holt sich die Methode das icon und die xposition. Anschließend wird es an die entsprechende Position auf der Bühne gezeichnet. In der Superklasse Waggon werden folgende Datenfelder yposition, hoehe, laenge und farbe nicht mehr benötigt. Hinzugefügt werden muss jedoch das Datenfeld ImageIcon icon. Im Konstruktor entfernst du auch die Initialisierungen yposition = 100; hoehe = 30; Wie Abbildung 8.43 zeigt, benötigt die Klasse Buehne von jedem Waggon sein icon und seine xposition. Deswegen musst du die Methode zeichne() ersetzen durch gibicon() und zusätzlich die Methode gibxposition() implementieren. Zur Zusammenstellung des Zugs benötigt die Klasse Zug in der Methode anhaengen() die Länge der einzelnen Waggons. Diese Länge entspricht nun der Größe der einzelnen Icons und wird mit der geänderten Methode giblaenge() geliefert /** Liefert das ImageIcon des entsprechenden Waggons. */ public ImageIcon gibicon() return icon; /** Liefert die x-position, wird von der Klasse Buehne benutzt. */ public int gibxposition() return xposition; /** Der Waggon liefert seine Laenge. */ public int giblaenge()

30 Kapitel 5 Das Projekt Bahn Seite 30 return icon.geticonwidth(); Abbildung 8.44: Die Methoden gibicon(), gibxposition() und giblaenge() in der Klasse Waggon Die letzten Änderungen werden in den Subklassen am Beispiel der Lokomotive durchgeführt. Nicht mehr benötigt werden im Konstruktor die Initialisierungen laenge = 40, farbe = Color.black. Dafür muss jedoch im Konstruktor das entsprechende jpg-bild aus dem Ordner Bilder geholt mit icon = new ImageIcon(Lokomotive.class.getResource("bilder/Lok.jpg")); Zum Schluss musst du noch die Methode zeichne() löschen, da sie nicht mehr benötigt wird. Diese Änderungen in der Sublasse Lokomotive musst du nun in analog in den Subklassen Personenwagen und Lokomotive durchführen. 8.4 Fortgeschrittene Modellierung des Zugs (2. Modell) Bemerkung: In der ersten, einfachen Modellierung hast du die Grundbegriffe der Vererbung und des Polymorphismus kennen gelernt. Allerdings weist dieses einfache Modell noch einige Mängel auf. Diese werden nun in einer weiteren, fortgeschrittenen Modellierung behoben. Hier stelle ich dir ein an die Realität besser angepasstes Modell vor. Das bisher beschriebene Modell des Zugs weist einige Mängel auf. Den schwerwiegendsten Mangel zeigt folgende Übung. Übung 8.26: Erstelle im Projekt Bahn03 oder Bahn04 einen Zug, der keine Lokomotive besitzt. Überprüfe, ob dieser Zug auch ohne Lokomotive fahren kann. Überlege, welche Mängel das bisherige Modell aufweist und wie diese beseitigt werden könnten Vererbungshierachie des 2. Modells Wiederum besteht der Zug aus einer Lokomotive und einer bestimmten Anzahl von Personenwagen und Güterwagen. Somit kannst du folgendes vorläufiges Modell der Waggons eines Zugs entwerfen.

31 Kapitel 5 Das Projekt Bahn Seite 31 Abbildung 8.45: Die Klasse Personenwagen und ein Objekt pwagen1 Abbildung 8.46: Die Klasse Lokomotive und ein Objekt lok Die Abbildungen 8.45 und 8.46 zeigen Modelle der Klasse Personenwagen und der Klasse Lokomotive mit zugehörigen Objekten. Wichtig in diesem verbesserten Modell des Zugs ist, dass ausschließlich die Lokomotive das Datenfeld geschwindigkeit besitzt und dieses mit entsprechenden Methoden später vergrößern bzw. verringern kann. Die Personen- und Güterwagen brauchen nur ihre xpositionen kennen. Somit wird gewährleistet, dass ein Zug ohne Lokomotive nicht fahren kann. Mit Hilfe der Mechanismen der Vererbung erhält man nun folgendes vorläufige Modell, das noch keine Methoden kennt. Abbildung 8.47: Personenwagen und Lokomotive erben von Waggon

32 Kapitel 5 Das Projekt Bahn Seite Datenfelder in Super- und Subklassen Übung 8.27: Erzeuge in BlueJ ein neues Projekt Bahn05a Implementiere die vier Klassen Waggon Gueterwagen Personenwagen Lokomotive mit den Datenfeld xposition, laenge, farbe Mit dem Datenfeld flaeche mit dem Datenfeld sitze mit dem Datenfeldern kmstand, geschwindigkeit Definiere die Klassen Gueterwagen, Personenwagen und Lokomotive als Subklassen und die Klasse Waggon als abstrakte Superklasse. Erzeuge nun Objekte der einzelnen Klassen und untersuche diese mit Hilfe des Inspektors Konstruktoren in Super- und Subklassen Übung 8.28: Implementiere die Konstruktoren der Superklasse Waggon und der drei Subklassen. Achte auf die korrekte Zugriffsstufe der Datenfelder. Erzeuge Objekte von allen drei Klassen und untersuche diese mit dem Inspektor. import java.awt.*; abstract public class Waggon private int xposition; protected int laenge; protected Color farbe; public Waggon() xposition = 0; Abbildung 8.48: Quelltext der Superklasse Waggon import java.awt.*; public class Lokomotive extends Waggon private int kmstand, geschwindigkeit; public Lokomotive() super(); laenge = 40;

33 Kapitel 5 Das Projekt Bahn Seite 33 farbe = Color.black; kmstand = 0; geschwindigkeit = 0; Abbildung 8.49: Quelltext der Subklasse Lokomotive Methoden in Super- und Subklassen Nun wirst du die Klassen mit Leben füllen. Der Zug, der aus mehreren Güterund Personenwagen und einer Lokomotive zusammengesetzt ist, soll nun fahren. In deinem Modell ist ausschließlich die Lokomotive für die Bewegung zuständig. Der Inspektor der Lokomotive zeigt jedoch, dass zum Zeitpunkt der Erzeugung ihre Geschwindigkeit den Wert 0 hat. Somit musst du in der Klasse Lokomotive eine Methode beschleunigen() implementieren, die ihre Geschwindigkeit vergrößert. /** Vergroessert die Geschwindigkeit der Lokomotive um 1. */ public void beschleunigen() geschwindigkeit += 1; Abbildung 8.50: Die Methode beschleunigen() in der Subklasse Lokomotive Jetzt kannst du zwar die Geschwindigkeit der Lokomotive vergrößern, jedoch müssen sich alle Waggons des Zugs um eine bestimmte Strecke dx bewegen. In diesem Zugmodell ist der Wert der Strecke dx gleich dem Wert der Geschwindigkeit der Lokomotive. Die Subklasse Lokomotive muss mit einer Methode gibgeschwindigkeit() den Wert für ihre momentane Geschwindigkeit liefern. Da diese Geschwindigkeit der Schrittweite dx aller Waggons entspricht, wird sie als Parameter dx der Methode bewegen() übergeben wird. /** Liefert die Geschwindigkeit der Lokomotive. */ public int gibgeschwindigkeit() return geschwindigkeit; Abbildung 8.51: Die Methode gibgeschwindigkeit() in der Subklasse Lokomotive Wenn also die Lokomotive nun die geschwindigkeit = 2 liefert, so sollen sich alle Waggons um dx = 2 nach rechts bewegen. Da diese Fähigkeit alle Waggons betrifft, ist es sinnvoll, die entsprechende Methode bewegen() in der Superklasse Waggon zu implementieren.

34 Kapitel 5 Das Projekt Bahn Seite 34 /** Bewegt den Waggon auf die neue x-position. */ public void bewegen(int dx) xposition += dx; Abbildung 8.52: Die Methode bewegen() in der Superklasse Waggon Übung 8.29: Implementiere die Methode beschleunigen() und gibgeschwindigkeit() in der Subklasse Lokomotive. Implementiere die Methode bewegen() in der Superklasse Waggon. Kompiliere das Projekt Bahn05. Überprüfe nun mit dem Inspektor, ob die Methode bewegen() die xposition der jeweiligen Objekte um den Wert des Parameters dx vergrößert. Implementiere auch eine Methode bremsen(), die die Geschwindigkeit der Lokomotive verringert. Überprüfe diese Methoden mit dem Inspektor Übung 8.30: Implementiere Methoden, die die Ladefläche eines Güterwagens, die Anzahl der Sitze eines Personenwagens und den kmstand einer Lokomotive liefern. Die Abbildung 8.53 zeigt deine bisherige Modellierung der Waggons, aus denen der Zug nun zusammengestellt wird. Abbildung 8.53: Modellierung der Waggons Der Zug wird zusammengestellt Nun wirst du aus einem Güterwagen, zwei Personenwagen und einer Lokomotive einen Zug zusammenstellen. Hierzu wird die Klasse Zug verwendet.

35 Kapitel 5 Das Projekt Bahn Seite 35 Abbildung 8.54: Ermittlung der xposition jedes einzelnen Waggons Der Zug ist also verantwortlich für die Berechnung der x-positionen seiner Waggons. Jeder Waggon liefert dem Zug mit der Methode giblaenge() seine Länge und der Zug errechnet hieraus die entsprechende x-position. Anschließend holt sich der Waggon mit der Methode holexposition() diese x- Position und speichert sie in seinem Datenfeld xposition. import java.util.*; public class Zug final static int ABSTAND = 2; private int waggonposition; private ArrayList<Waggon> waggonliste; public Zug() Methodenkörper public void anhaengen(waggon waggon) Methodenkörper Abbildung 8.55: Unvollständiger Quelltext der Klasse Zug Die Berechnung der x-position jedes einzelnen Waggons erfolgt in der Klasse Zug. In der Methode anhaengen() wird ein neuer Waggon der waggonliste hinzugefügt und die jeweilige Waggonposition dem gerade neu angehängten Waggon übergeben. Anschließend wird gleich die neue Waggonposition für den nächsten Waggon berechnet. Übung 8.31: Speichere dein Projekt unter dem Namen Bahn05b.

36 Kapitel 5 Das Projekt Bahn Seite 36 Implementiere in der Klasse Waggon a) die Methode giblaenge(), die die jeweilige Länge des Waggons liefert, b) die Methode holexposition(), die die berechnete x-position in das Datenfeld xposition schreibt. Implementiere die Klasse Zug mit ihren Datenfeldern, ihrem Konstruktor und ihrer Methode anhaengen(). Nun stelle einen Zug zusammen. Überprüfe mit Hilfe des Inspektors entsprechend den Abbildung 8.54 und 8.56 die x-positionen der entsprechenden Waggons im Zug. Abbildung 8.56: Die Inspektoren zeigen die korrekten x-positionen der Waggons im Zug Der Zug fährt Nachdem du nun den Zug aus verschiedenen Waggons zusammengesetzt hast, sollte dieser auch fahren. Du musst also zuerst die Geschwindigkeit der Lokomotive vergrößern (diese hat zurzeit den Wert 0) und anschließend alle Waggons bewegen. Da nur in der Klasse Lokomotive die Methode beschleunigen() implementiert ist, wird in der Sammlung waggonliste nach dieser Lokomotive gesucht und ihre Methode beschleunigen() zum Vergrößern der Geschwindigkeit aufgerufen. /** Die Lokomotive vergroessert ihre Geschwindigkeit. */ public void vergroesseregeschw() for (Waggon waggon : waggonliste) if (waggon instanceof Lokomotive) Lokomotive lok = (Lokomotive) waggon; lok.beschleunigen(); Abbildung 8.57: Die Methode vergroessere Geschw() in der Klasse Zug

37 Kapitel 5 Das Projekt Bahn Seite 37 Um nun den kompletten Zug fahren zu lassen, wird die Sammlung waggonliste durchlaufen und von jedem Waggon dessen Methode bewegen(dx) aufgerufen. Die Schrittweite dx entspricht der momentanen geschwindigkeit der Lokomotive, deren Wert zuvor noch ermittelt werden muss. /** Der gesamte Zug faehrt gleichmaessig um dx weiter. */ public void fahren() int dx = 0; //Schrittweite = Geschwindigkeit der Lokomotiv //holt sich die Geschwindigkeit der Lokomotive for (Waggon waggon : waggonliste) if (waggon instanceof Lokomotive) Lokomotive lok = (Lokomotive) waggon; dx = lok.gibgeschwindigkeit(); //alle Waggons bewegen sich um dx for (Waggon waggon : waggonliste) waggon.bewegen(dx); Abbildung 8.58: Die Methoden fahren() in der Klasse Zug Zum Durchlaufen der waggonliste wird eine for-each-schleife verwendet. Hier wird eine Schleifenvariable waggon vom Typ Waggon deklariert, die dann nacheinander für alle Elemente der Sammlung waggonliste verwendet wird. Übung 8.32: Implementiere die Methoden vergroesseregeschw() und fahren() in der Klasse Zug. Überprüfe mit Hilfe des Inspektors, ob sich bei allen Waggons im Zug die xposition korrekt vergrößert. Implementiere nun eine Methode verringeregeschw(). Die Abbildung 8.59 zeigt deine bisherige Modellierung des Zugs, der aus drei verschiedenen Waggontypen zusammengestellt werden kann.

38 Kapitel 5 Das Projekt Bahn Seite 38 Abbildung 8.59: Modellierung des Zugs (2. Modell) Übung 8.33: Erstelle einen Zug ohne Lokomotive. Überprüfe nun, welche Auswirkungen die Methoden vergroesseregeschw(), verringeregeschw() und fahren() auf die x- Position der Waggons haben Eventuell könntest du hier noch eine entsprechende Fehlermeldung ausgeben. 8.5 Abstrakte Methoden Übung 8.34: Speichere nun dein Projekt Bahn05b unter dem Namen Bahn06. Der Zugführer möchte nun die Gesamtdaten des Zuges ermitteln: a) wie groß ist die Ladefläche aller Güterwagen zusammen, b) wie viele Sitzplätze zählen alle Personenwagen zusammen, c) welchen Kilometerstand besitzt die Lokomotive, d) mit welcher Geschwindigkeit fährt der Zug gerade. Um die Gesamtladefläche zu erhalten, implementierst du eine Methode gibflaeche(), die alle in einem Zug gesammelten Waggons durchläuft und

39 Kapitel 5 Das Projekt Bahn Seite 39 speziell bei den Güterwagen deren Fläche addiert. Abbildung 8.60 zeigt eine solche mögliche Methode. /** Liefert die Gesamtladeflaeche aller Gueterwagen. */ public int gibflaeche() int flaeche = 0; for (Waggon waggon : waggonliste) if (waggon instanceof Gueterwagen) Gueterwagen gwagen = (Gueterwagen) waggon; flaeche += gwagen.gibflaeche(); return flaeche; Abbildung 8.60: Die Methoden gibflaeche() in der Klasse Zug Dieser Quelltext macht folgendes Problem deutlich. In der waggonliste werden Waggons gesammelt. Trotzdem musst du herausfinden, um welche Art von Waggon es sich handelt. Da die waggonliste nur die Supertypen waggon zurückliefert, musst du anschließend den Cast-Operator anwenden, um den richtigen Subtyp gwagen, pwagen oder lok zu erhalten. Erst jetzt kann die entsprechende Methode des jeweiligen Subtyps aufgerufen werden. Dies alles ist ein deutlicher Hinweis, dass du noch nicht alle Vorteile der Vererbung ausgeschöpft hast. Du wirst nun lernen, wie in der Superklasse Waggon eine Methode gibdaten() implementiert wird, die in jeder Subklasse redefiniert wird. Du benutzt also einen polymorphen Methodenaufruf, damit jeder Waggon seine speziellen Daten dem Zug mitteilen kann. Abbildung 8.61 zeigt den Quelltext in der Subklasse Gueterwagen mit diesem Lösungsansatz. /** Liefert die Ladeflaeche. */ public int gibdaten() return flaeche; Abbildung 8.61: Die Methode gibdaten() in der Klasse Gueterwagen Statt also jedem Waggon genau mitzuteilen, welche Daten er liefern soll (also gibflaeche(), gibsitze() oder gibkmstand()), sagt man ihm nur noch, dass er

40 Kapitel 5 Das Projekt Bahn Seite 40 Daten zu liefern hat. Welche Daten er dann liefert, bleibt somit jedem Waggon selbst überlassen. /** Liefert die Gesamtladeflaeche aller Gueterwagen. */ public int gibflaeche() int flaeche = 0; for (Waggon waggon : waggonliste) if (waggon instanceof Gueterwagen) flaeche += waggon.gibdaten(); return flaeche; Abbildung 8.62: Die Methode gibflaeche() in der Klasse Zug Übung 8.35: Verändere in der Subklasse Gueterwagen die entsprechenden Methodennamen wie in Abbildung 8.60 dargestellt. Implementiere nun in der Klasse Zug die Methode gibflaeche() aus Abbildung Allerdings lässt sich nun das Projekt nicht mehr kompilieren. Die Abbildung 8.63 zeigt die Fehlermeldung cannot find symbol method gibdaten() in der Klasse Zug. Abbildung 8.63: Fehlermeldungen in der Klasse Zug Diese Fehlermeldung ist verständlich, da die Methode gibdaten() nicht in der Superklasse Waggon implementiert, sondern in deren Subklassen.

41 Kapitel 5 Das Projekt Bahn Seite 41 Die Variable waggon ist vom Typ Waggon und der Aufruf waggon.gibdaten() kann nur kompiliert werden, wenn die Klasse Waggon eine solche Methode besitzt. Das Problem aber ist, dass du in der Superklasse Waggon keine vernünftige Implementierung angeben kannst, weil je nach Subtyp andere Daten geliefert werden. Die Lösung ist, diese Methode in der Superklasse Waggon als abstract zu deklarieren. /** Abstrakte Methode, um die Daten der Subtypen zu erhalten. */ abstract public int gibdaten(); Abbildung 8.64: Abstrakte Methode gibdaten() in der Superklasse Waggon Da diese abstrakte Methode keinen Rumpf hat, kann sie auch niemals ausgeführt werden. Aber eine Ausführung der Methode ist auch nicht beabsichtigt, da von der abstrakten Superklasse Waggon keine Objekte erzeugt werden können. Solche abstrakten Klassen mit abstrakten Methoden erzwingen, dass Subklassen die abstrakt deklarierten Methoden überschreiben (redefinieren). Nur wenn eine Subklasse eine Implementierung für eine geerbte abstrakte Methode anbietet, können von ihr Objekte erzeugt werden. Übung 8.36: a) Verändere in allen Subklassen die entsprechenden Methoden. b) Implementiere nun in der Superklasse Waggon die abstrakte Methode gibdaten(). Beachte, dass im Quelltext solche abstrakten Methoden direkt hinter den Konstruktoren anzuordnen sind! c) Implementiere in der Klasse Zug entsprechende Methoden (ähnlich wie gibflaeche() ), die die Gesamtzahl der Sitze und den Kilometerstand der Lokomotive liefert. d) Überprüfe nun dein Projekt Bahn03 mit Hilfe des Inspektors. Falls du Probleme beim Ermitteln des Kilometerstands der Lokomotive hattest, solltest du die folgenden beiden Methoden untersuchen. /** Vergroessert den kmstand um geschwindigkeit. */ public void erhoehekmstand() kmstand += Math.abs(geschwindigkeit); /** Der gesamte Zug faehrt gleichmaessig. */ public void fahren()

42 Kapitel 5 Das Projekt Bahn Seite 42 eventuell weitere Anweisungen for (Waggon waggon : waggonliste) waggon.bewegen(); if (waggon instanceof Lokomotive) Lokomotive lok = (Lokomotive) waggon; lok.erhoehekmstand(); Abbildung 8.65: Die Methoden erhoehekmstand() in der Klasse Lokomotive und fahren() in der Klasse Zug Wie in jedem modernen ICE soll den Fahrgästen auch noch die aktuelle Momentangeschwindigkeit angezeigt werden. Übung 8.37 Implementiere eine geeignete Methode gibmomentangesch(), so dass die Klasse Zug die Momentangeschwindigkeit des Zugs (besser der Lokomotive) liefert. Im Prinzip ist der Zug nun fertig. Das ganze Programm wirkt jedoch langweilig, wenn dieser Zug nicht grafisch dargestellt wird. Die Erstellung einer grafischen Benutzeroberfläche für diese fortgeschrittene Modellierung wird dir nun in den folgenden Kapiteln gezeigt. 8.6 Die grafische Oberfläche Die grafische Benutzeroberfläche für diese Modellierung ist weit gehend bereits vorbereitet. Ich habe diese in zwei größere Panels eingeteilt: das Einstellungspanel einstellungp, das die Buttons zur Zusammenstellung des Zugs und zur Bewegung des Zugs enthält, und das Darstellungspanel darstellungp, das die Bühne für den Zug und dessen Fahrt darstellt.

43 Kapitel 5 Das Projekt Bahn Seite 43 Abbildung 8.66: Die vorbereitete grafische Oberfläche von BahnGUI Das Projekt BahnGUI_2 enthält bereits die Klassen Ansicht und Buehne. Die Klasse Ansicht erzeugt die in Abbildung 8.66 dargestellte Benutzeroberfläche. Sie enthält a) die Zeichenfläche, in der der Zug dargestellt werden soll, b) Buttons, Textfelder und die dafür notwendigen Methoden, von denen zum jetzigen Zeitpunkt viele noch auskommentiert sind, Die Klasse Buehne dient zur bildlichen Darstellung des Zugs. Sie enthält zum jetzigen Zeitpunkt bereits die Methode paintcomponent(), die den oben abgebildeten schwarzen Elementarwaggon zeichnet, der später durch die entsprechenden Objekte ersetzt wird. Übung 8.38: Hole vom Schulserver das Projekt BahnGUI_2. Speichere dieses unter dem Namen Bahn07. Vergleiche dazu die Abbildung Füge aus Bahn06 mit Hilfe von Edit > Add Class from File die Klassen Zug, Waggon, Lokomotive, Personenwagen und Gueterwagen in das Projekt Bahn07 hinzu Zeichnen des Zugs Du musst dir nun überlegen, was alles in der Klasse Ansicht passiert, wenn der Benutzer auf den Button neupersonb gedrückt wird. 1. Das Objekt pwagen der Klasse Personenwagen wird erzeugt.

44 Kapitel 5 Das Projekt Bahn Seite Dieses Objekt pwagen wird an den Zug angehängt: zug.anhaengen(). 3. Damit die Klasse Buehne nun alle Waggons des Zugs zeichnen kann, muss a) die Klasse Zug eine Liste aller Waggons liefern: gibwaggonliste() b) die Klasse Buehne diese Liste aller Waggons sich holen: holewaggonliste(), c) um nun diese Liste der Reihe nach zu durchlaufen und somit die Waggons auch bildlich darstellen: zeichne() Du siehst, es gibt einiges zu tun. Am besten, du fängst mit dem letzten Punkt 3c) an. In der Klasse Buehne wird die Methode paintcomponent()implementiert: /** Zeichnet den Zug mit allen Waggons. */ public void paintcomponent(graphics g) for (Waggon waggon : waggonliste) waggon.zeichne(g); Abbildung 8.67: Die Methode paintcomponent() in der Klasse Buehne Hier wird also die Waggonliste durchlaufen. Jeder einzelne Waggon muss sich nun selbst zeichnen. Vorläufig sollen all diese Waggons nur aus einem Rechteck und den beiden Rädern bestehen. Somit erhält die Klasse Waggon die Methode zeichne(). /** Zeichnet die allgemeine Form des Waggons. */ public void zeichne(graphics g) g.setcolor(farbe); g.fillrect(xposition, yposition, laenge, hoehe); //Kasten g.filloval(xposition+5, yposition+hoehe, 7, 7); //Hinterrad g.filloval(xposition+(laenge-12), yposition+hoehe, 7, 7); //Vorderrad Abbildung 8.68: Die Methode zeichne() in der Klasse Waggon Übung 8.39: a) Ersetze in der Klasse Buehne die Methode paintcomponent() durch die in Abbildung 8.67 vorgeschlagene.

45 Kapitel 5 Das Projekt Bahn Seite 45 b) Implementiere in der Klasse Waggon die Methode zeichne(). Weiterhin werden die Datenfelder yposition und hoehe benötigt, die im Konstruktor initialisiert werden. public Waggon() xposition = 0; yposition = 100; hoehe = 30; Nun werden die Punkte 3a) und 3b) abgearbeitet. Die Klasse Zug besitzt die Sammlung aller Waggons, aus denen der Zug zusammengestellt wurde. Diese Liste muss die Klasse Zug nun liefern können. /** Liefert die Waggonliste. */ public ArrayList<Waggon> gibwaggonliste() return waggonliste; Abbildung 8.69: Die Methode gibwaggonliste() in der Klasse Zug Die Klasse Buehne, die verantwortlich für das Zeichnen des Zuges ist, holt sich anschließend diese Liste aller Waggons. /** Holt sich die Waggonliste. */ public void holewaggonliste(arraylist<waggon> waggonlisteh) waggonliste = waggonlisteh; Abbildung 8.70: Die Methode holewaggonliste() in der Klasse Buehne Übung 8.40: Implementiere in der Klasse Zug die Methode gibwaggonliste() und in der Klasse Buehne die Methode holewaggonliste(). Zum Schluss musst du noch die beiden Punkte 1 und 2 bearbeiten. /** Reagiert auf Druecken des Buttons Personenwagen. */ public void personenwagenaction() pwagen = new Personenwagen(); zug.anhaengen(pwagen);

46 Kapitel 5 Das Projekt Bahn Seite 46 sitzetf.settext("" + zug.gibsitze()); zeichnezug(); Abbildung 8.71: Die Methode personenwagenaction() in der Klasse Ansicht Hier wird also ein Objekt pwagen der Klasse Personenwagen erzeugt und anschließend mit Hilfe der Methode zug.anhaengen() an den Zug angehängt. Danach ermittelt der Zug noch die Anzahl der Sitze aller seiner Personenwagen und trägt diese in das entsprechende Textfeld sitzetf ein. Übung 8.41: Entferne nun in der Klasse Ansicht alle Auskommentierungen außer diejenigen, die zur Bewegung des Zugs benötigt werden. Implementiere die Methode personenwagenaction() aus Abbildung 8.71 in der Klasse Ansicht. Teste nun dein Projekt Bahn07. Du kannst zum jetzigen Zeitpunkt nur Personenwagen erzeugen. Die Abbildung 8.72 zeigt, wie sich für jeden neuen Personenwagen die Anzahl der Sitze um 50 erhöht. Abbildung 8.72: Drei Personenwagen ergeben 150 Sitzplätze Übung 8.42: Implementiere auch die Methoden gueterwagenaction() und lokomotiveaction() in der Klasse Ansicht. Nach dem Kompilieren solltest du ein Klassendiagramm wie in Abbildung 8.73 und eine Oberfläche wie in Abbildung 8.74 erhalten.

47 Kapitel 5 Das Projekt Bahn Seite 47 Abbildung 8.73: Klassendiagramm des Projekts Bahn07 Abbildung 8.74: Vorläufige Oberfläche des Projekts Bahn03 Vielleicht gefällt dir der Zug in Abbildung 8.1 etwas besser. Aber für den Anfang sieht er doch gar nicht so übel aus.

48 Kapitel 5 Das Projekt Bahn Seite Bewegen des Zugs Nun wirst du dem Zug das Fahren beibringen. In der Klasse Zug hast du bereits die Methoden vergroesseregeschw(), verringeregeschw() und fahren() implementiert. Diese Methoden müssen nun von der Klasse Ansicht verwendet werden. Im Konstruktor der Klasse Ansicht wird die Methode bewegen() aufgerufen. Diese startet den Timer, der im Konstruktor der Klasse Ansicht erzeugt wurde und alle 50 ms ein Signal sendet, d.h. er ruft alle 50 ms die Methode timeran() auf. In dieser Methode bewegt sich der gesamte Zug nach rechts. Anschließend wird der aktuelle Kilometerstand in das zugehörige Textfeld eingetragen und der Zug auf in der neuen Position auf der Bühne gezeichnet. Allerdings hat zu Beginn das Datenfeld geschwindigkeit noch den Wert 0, der Zug wird also immer auf derselben Position gezeichnet. Klickt der Benutzer auf den Button mit dem Rechtspfeil, so registriert dieser Button das Ereignis und ruft die Methode beschleunigenaction() auf. Diese verwendet nun die entsprechende Methode vergroesseregeschw() in der Klasse Zug und setzt gleichzeitig die Momentangeschwindigkeit in das zugehörige Textfeld. /** Reagiert auf Druecken von beschleunigenb. */ public void beschleunigenaction() zug.vergroesseregeschw(); geschwindigkeittf.settext("" + zug.gibmomentangeschw()); Abbildung 8.75: Die Methode beschleunigenaction() in der Klasse Ansicht Nun kann der Zug auf der Oberfläche nach rechts fahren. Übung 8.43: Entferne nun in der Klasse Ansicht alle Auskommentierungen, die auch zur Bewegung des Zugs benötigt werden. Implementiere auch die Methoden beschleunigenaction() in der Klasse Ansicht. Überprüfe, ob der Zug mit verschiedenen Geschwindigkeiten nach rechts fahren kann. Implementiere auch eine Methode bremsenaction(). 8.7 Individuelle Gestaltung der Waggons In diesem letzten Abschnitt wirst du nun die Waggons je nach Klasse etwas individueller zeichnen oder durch ImageIcons darstellen.

49 Kapitel 5 Das Projekt Bahn Seite Darstellung von Einzelheiten Abbildung 8.76 zeigt, dass alle Güterwagen Kohle geladen haben, alle Personenwagen Fenster besitzen und die Lokomotive zusätzlich noch einen Schornstein hat. Hierzu werden wieder die Konzepte der Vererbung aufgegriffen. Abbildung 8.76: Das Projekt Bahn08 Übung 8.44: Speichere dein Projekt Bahn07 unter dem Namen Bahn08. Um die oben genannten Details der jeweiligen Waggons darzustellen, bearbeite das Kapitel Darstellung durch ImageIcons Bisher hast du die einzelnen Waggons gezeichnet. Eine andere Möglichkeit zur Darstellung der Waggons ist die Verwendung von ImageIcons. Abbildung 8.77 zeigt eine Möglichkeit, auf der grafischen Benutzeroberfläche solche ImageIcons zu verwenden. Mehrere solche jpg-bilder befinden sich im Ordner Bilder, der im Projekt BahnGUI_2 mitgeliefert wird.

5 Das Projekt Apfelwein

5 Das Projekt Apfelwein Kapitel 5 Zustandsorientierte Modellierung (Teil 1) Seite 1 5 Das Projekt Apfelwein Bemerkung: In der 10. Jahrgangsstufe (G8) werden die Schüler in die zustandsorientierte Programmierung eingeführt. Dies

Mehr

2. Vererbung und Kapselung

2. Vererbung und Kapselung 2. Vererbung und Kapselung Die Objekte der Klasse BALL werden im Gegensatz zu den Objekten von KREIS noch nicht graphisch dargestellt. Um die BALL-Objekte auch graphisch darzustellen zu können, muss BALL

Mehr

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor: 4. Vererbung Grundlagen der Vererbung 4. Vererbung 4. Vererbung Grundlagen der Vererbung Idee der Vererbung Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende

Mehr

Überschreiben von Methoden

Überschreiben von Methoden Vergleich der DoME Realisierungen: Methode ausgeben Version 1 (ohne Vererbung): Anzeigen aller Informationen CD: A Swingin Affair (64 Min)* Frank Sinatra Titelanzahl: 16 Mein Lieblingsalbum von Sinatra

Mehr

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus Vererbung Generalisierung und Spezialisierung Vererbung und Polymorphismus Wir wollen in unserem Aquarium verschiedene Arten von Fischen schwimmen lassen. In einem ersten Ansatz definieren wir nicht nur

Mehr

9. Zurück zur OOP: Vererbung und Polymorphismus

9. Zurück zur OOP: Vererbung und Polymorphismus bertram.hafner@t-online.de Informatik 11 Seite 38 9. Zurück zur OOP: Vererbung und Polymorphismus Eine neue Klasse wird immer durch Vererbung aus einer bereits vorhandenen Klasse abgeleitet. Durch die

Mehr

Begriffe 1 (Wiederholung)

Begriffe 1 (Wiederholung) Begriffe 1 (Wiederholung) Klasse Eine Klasse ist der Bauplan für ein oder mehrere Objekte. In einer Klasse werden Dienste (Methoden) zur Verfügung gestellt. Klassennamen beginnen mit einem Großbuchstaben.

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 41 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick: Vererbung 2 Grundidee Vererbung 3 Verdeckte Variablen

Mehr

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener

Mehr

Der Ball kann angezeigt werden: anzeigen( ) {... } Der Ball kann z.b. seine Größe verändern: groesseaendern(int veraenderung) {... } usw.

Der Ball kann angezeigt werden: anzeigen( ) {... } Der Ball kann z.b. seine Größe verändern: groesseaendern(int veraenderung) {... } usw. Objekt-Orientierung Die ersten objektorientierten Sprachen wurden ab 1967 entwickelt (Simula, Smalltalk). Die Grundidee besteht darin, Objekte der realen Welt abzubilden. Java-Programme bestehen aus Klassen.

Mehr

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz Kapitel 13 Abstrakte Methoden und Interfaces 13. Abstrakte Klassen und Interfaces 1. Abstrakte Klassen 2. Interfaces und Mehrfachvererbung Folie 12.2 Abstrakte Methoden und Klassen Manchmal macht es überhaupt

Mehr

Java für Bauingenieure

Java für Bauingenieure 1 JAVA für Bauingenieure Alexander Karakas SS 2008 Objektorientierte Programmierung 30.04.2008, CIP Pool Objektorientierte Programmierung Übersicht 2 Klasse und Objekt Polymorphismus und Vererbung Klassen

Mehr

Vererbung, Polymorphie

Vererbung, Polymorphie Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08

Mehr

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5. Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 23.5.07 G. Bohlender (IANM UNI Karlsruhe) Vererbung 23.5.07 1 / 22 Übersicht 1

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0 9 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Wiederholung: Gerüstbeispiel Ein Duo, Quarto oder Sexto ist ein Gerüst. Die Klassen Duo, Quarto und Sexto sollen durch Vererbung

Mehr

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei Lösungsvorschläge zur Klausur zum Kurs 1618 Sommersemester 2001 am 22.9.2001 Aufgabe 1 a) Benutzungsbeziehung: class Kennzeichen class Fahrzeug boolean gueltigeskennzeichen (Kennzeichen kz) Objekte der

Mehr

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank... Methoden und Klassen Silke Trißl Wissensmanagement in der Bioinformatik Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: hat Farbe Hubraum Tank kann man Gas geben Bremsen Hoch

Mehr

C++ - Objektorientierte Programmierung Vererbung

C++ - Objektorientierte Programmierung Vererbung C++ - Objektorientierte Programmierung Vererbung Personen Kunden Mitarbeiter Verwaltung Verkäufer Leibniz Universität IT Services Anja Aue Vererbung Definition von Klassen auf Basis von bestehenden Klassen.

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 09: Vererbung Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil Einführung in die Vererbung Motivation Das Schlüsselwort extends Einführendes

Mehr

Java Einführung Vererbung und Polymorphie. Kapitel 13

Java Einführung Vererbung und Polymorphie. Kapitel 13 Java Einführung Vererbung und Polymorphie Kapitel 13 Inhalt Klassifikation (UML) Implementierung von Vererbungshierarchien Überschreiben von Methoden Polymorphismus: Up-Casting und Dynamisches Binden Schlüsselwort

Mehr

EAD II Übung 5. Graphische Benutzungsoberfläche mit BlueJ

EAD II Übung 5. Graphische Benutzungsoberfläche mit BlueJ EAD II Übung 5 Graphische Benutzungsoberfläche mit BlueJ Graphische Benutzungsoberfläche (GUI) Fenster, das weitere Komponenten zur Darstellung und Interaktion enthält spezielle Standardbibliotheken erforderlich,

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Programmieren in Java

Programmieren in Java Einführung in die Objektorientierung Teil 4 Interfaces, innere Klassen und Polymorphie 2 Vererbung im Klassendiagram (Wiederholung) Vererbung repräsentiert eine ist ein Beziehung zwischen Klassen Ware

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 11: Vererbung Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil Einführung in die Vererbung Motivation Das Schlüsselwort extends Einführendes

Mehr

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester

Mehr

12 Abstrakte Klassen, finale Klassen und Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces 12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke Institut für Programmierung und Reaktive Systeme Java 6 Markus Reschke 13.10.2014 OOP Objekte = Verhalten (durch Methoden) + Daten (durch Attribute) Klassen = Baupläne für Objekte Kapselung von Programmteilen

Mehr

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Test-Besprechung! Ziele verdeutlichen Große Bild von OOP Wiederholung: Einbettung als Technik

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

Fragen zur OOP in Java

Fragen zur OOP in Java - 1 - Inhalt Was bedeutet OOP?... 2 Was versteht man unter einer Klasse?... 2 Wie nennt man die Mitglieder einer Klasse?... 2 Wie erzeugt man Objekte?... 2 Wie greife ich auf Member einer Klasse zu?...

Mehr

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik Methoden und Klassen Silke Trißl Wissensmanagement in der Bioinformatik Wiederholung Jede Applikation braucht eine Klasse mit einer main-methode Eintrittspunkt in das Programm Die main-methode wird public

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung Javakurs FSS 2012 Lehrstuhl Stuckenschmidt Tag 3 - Objektorientierung Warum Objektorientierung Daten und Funktionen möglichst eng koppeln und nach außen kapseln Komplexität der Software besser modellieren

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe: Musterlösung Übung 7 Aufgabe 1 Sehen wir uns zu allererst das gegebene Forth Programm an: 0 3 new - list constant list1 list1 5 new - list constant list2 list1 6 new - list constant list3 list2 2 new -

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Staubsauger-Roboter. Als Vorlage dienen dir drei Klassen: RECHTECK Damit kannst du die Wände des Raums darstellen.

Staubsauger-Roboter. Als Vorlage dienen dir drei Klassen: RECHTECK Damit kannst du die Wände des Raums darstellen. Projekt: Staubsauger-Roboter Immer beliebter werden die kleinen automatischen Haushaltshilfen. Du sollst nun einen Staubsauger-Roboter programmieren, der gesteuert von einer künstlichen Intelligenz (KI)

Mehr

Umsetzung einer Klassenkarte in einer Programmiersprache

Umsetzung einer Klassenkarte in einer Programmiersprache Klassen in Java Umsetzung einer Klassenkarte in einer Programmiersprache Objektorientierte Programme bestehen (nur) aus Klassendefinitionen In Klassendefinitionen wird die Struktur der Objekte festgelegt,

Mehr

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode Methoden und Klassen Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik Wiederholung Jede Applikation braucht eine Klasse mit einer main-methode Eintrittspunkt in das Programm Die main-methode

Mehr

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon. Der Operator this Wir betrachten nochmals die Klassendefinition von Ballon. public class Ballon { private int durchmesser; private int x1, y1; private Color farbe =Color.black; // Konstruktor ohne Farbe

Mehr

5 Projekt Bankverwaltung

5 Projekt Bankverwaltung Kapitel 5 Bankverwaltung (Lösung) Seite 1/7 5 Projekt Bankverwaltung 5.1 Festlegen der Schnittstelle Bevor du mit der Programmierung beginnst, musst du dir einige Gedanken über die Schnittstelle zwischen

Mehr

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java Bisherige Beobachtungen zu Objekten: werden in Klassen zusammengefasst besitzen Eigenschaften und Verhalten verbergen private Informationen werden geboren, leben und

Mehr

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 2 22.03.2017 Was bisher geschah... Klassen und Objekte Attribute und Methoden Klasse Bruch

Mehr

Objektorientierte Programmierung. Kapitel 14: Interfaces

Objektorientierte Programmierung. Kapitel 14: Interfaces 14. Interfaces 1/26 Objektorientierte Programmierung Kapitel 14: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2013/14 http://www.informatik.uni-halle.de/ brass/oop13/

Mehr

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der Vererbung Vererbung ist ein Konzept der objektorientierten Programmierung,, die es ermöglicht neue Klassen von bereits vorhandenen Klassen abzuleiten. In einer abgeleiteten Klasse (subclass) muss nur spezifiziert

Mehr

Einführung in die Programmiersprache Java II

Einführung in die Programmiersprache Java II Einführung in die Programmiersprache Java II ??????????? UML OOP "Object oriented programming is bad" - professional retard 90s... UML Entwicklungsziele verschiedenen existierenden objektorienten Modellierungsmethoden

Mehr

14. Java Objektorientierung

14. Java Objektorientierung Objektorientierung: Verschiedene Aspekte Daten Typhierarchie Objekte 14. Java Objektorientierung Code Vererbung Unter- und Oberklassen Klassen, Vererbung, Kapselung Methoden überschreiben Unterklassen

Mehr

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober 2001 Stefan Holland Informatik II Hinweise: Klausur II Verwenden Sie für Ihre Lösungen ausschließlich

Mehr

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Anwendungsentwicklung mit Java Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Vererbung (1) 2 Problem: Objekte mit gleichen Attributen/Methoden, aber nicht völlig identisch, z.b., LKW, PKW,

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 10: Mehr zur Vererbung und abstrakte Klassen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Mehr zur Vererbung Methoden vererben und überschreiben

Mehr

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 5 12.04.2017 Was bisher geschah... Objektorientierte Programmierung Klassen und Objekte, Attribute

Mehr

Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs

Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs 31. Mai 2016 Grundbegriffe (I) Objektorientierung: Sichtweise auf komplexe Systeme, bei der ein System durch das Zusammenspiel kooperierer

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

Vererbung. Martin Wirsing. Ziele. Vererbung

Vererbung. Martin Wirsing. Ziele. Vererbung 2 Ziele Martin Wirsing en Begriff der einfachen verstehen und Redefinition von Oberklassenmethoden verstehen spolymorphie verstehen ie Klasse Object kennenlernen in Zusammenarbeit mit Michael Barth, Philipp

Mehr

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete 2 Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, und Pakete Martin Wirsing Ziele Den Begriff der einfachen und mehrfachen Vererbung verstehen Verstehen, wann Vererbung eingesetzt wird deklarationen

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern

Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern Thema Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern Referent: Frank Sanders Seite 1 Inhalt Der Vortrag hat einen sehr kurzen Einleitungsteil der sich mit Objektorientierung

Mehr

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus Vorlesung Programmieren Vererbung und Polymorphismus Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Bisher: Klassen und Objekte Haupteigenschaften:

Mehr

Java Vererbung. Inhalt

Java Vererbung. Inhalt Java Vererbung Inhalt 1 Zielsetzung... 2 1.1 Bewertung... 2 2 Grundlagen der Vererbung... 2 2.1 Super und Subklassen... 2 3 Überladen von Methoden... 4 3.1 Unterschiedliche Parameter... 4 3.2 Gleiche Parameter

Mehr

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte Grundkonzepte Objektorientierter Programmierung Nicole Himmerlich FSU Jena mit Java, Oberon-2, Object-Pascal und Python Inhaltsüberblick I. Grundbegriffe 1) Kopplung 2) Datenkaspelung 3) Konstruktor 4)

Mehr

Programmieren in Java -Eingangstest-

Programmieren in Java -Eingangstest- Programmieren in Java -Eingangstest- Nummer: 1. Studiengang: Informatik B.Sc. Informatik M.Sc. ESE B.Sc. ESE M.Sc. Sonstiges: Fachsemester: Bitte Fragen, die Sie nicht beantworten können unbedingt mit

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen 5 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Referenzen Beispiel an der einfachen Klasse Walze: public class Walze { int id; public Walze(int id) { this.id = id; Verwenden

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte

Mehr

Tutorial zu Einführung in die Informatik für LogWi- Ings und WiMas Wintersemester 2015/16. 1 Zauberer und Zwerge, Aufgabenteil 1

Tutorial zu Einführung in die Informatik für LogWi- Ings und WiMas Wintersemester 2015/16. 1 Zauberer und Zwerge, Aufgabenteil 1 Tutorial zu Einführung in die Informatik für LogWi- Ings und WiMas Wintersemester 2015/16 1 Zauberer und Zwerge, Aufgabenteil 1 Stellen Sie sich vor, Sie sollen eine Charakterverwaltung für das neue Onlinerollenspiel

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

3. Das erste eigene Programm mit Greenfoot: Litte Crab

3. Das erste eigene Programm mit Greenfoot: Litte Crab Eigenes Programm: Little Crab1, Seite 1 von 5 3. Das erste eigene Programm mit Greenfoot: Litte Crab 3.1. Quelltext bearbeiten Nachdem Sie etwas Erfahrungen in der Bedienung von Greenfoot gewonnen haben,

Mehr

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen 7. Schnittstellen Grundlagen zu Schnittstellen 7. Schnittstellen Eine Schnittstelle (Interface) ist eine Spezifikation eines Typs in Form eines Typnamens und einer Menge von Methoden, die keine Implementierungen

Mehr

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax Weitere Beispiele Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts public interface Funktion { boolean istimdefbereich(double x); double wert(double x); String gibbeschreibung(); public interface

Mehr

Vorlesung Datenstrukturen

Vorlesung Datenstrukturen Vorlesung Datenstrukturen Objektorientierung in C++ (2) Beziehungen zwischen Klassen Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 530 Beziehungen zwischen Klassen Assoziation

Mehr

Vererbung. Oberklassen und Unterklassen

Vererbung. Oberklassen und Unterklassen Vererbung Oberklassen und Unterklassen Vererbung ist ein zentrale Bestandteil der Objektorientierung. Man beschreibt damit die Möglichkeit, Eigenschaften und Methoden vorhandener Klassen auf andere (neue)

Mehr

Objektorientierte Programmierung mit Java

Objektorientierte Programmierung mit Java David J. Barnes Michael Kölling Objektorientierte Programmierung mit Java Eine praxisnahe Einführung mit BlueJ Übersetzt von Axel Schmolitzky, Universität Hamburg PEARSON Studium ein Imprint von Pearson

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt. Für eine abstrakte Klasse

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen Auswertung von Ausdrücken Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt.

Mehr

1 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces 1 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

6. Globalübung (zu Übungsblatt 8)

6. Globalübung (zu Übungsblatt 8) 6. Globalübung (zu Übungsblatt 8) Inhalt: Klassenhierarchien Verdecken von Attributen Überschreiben von Methoden Codeanalyse Analyse von JAVA-Programmen Semestralklausur Klausurtermin: Mittwoch 11.01.2006

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java Einführung in die objektorientierte Programmierung Teil 2 2 Übersicht der heutigen Inhalte Vererbung Abstrakte Klassen Erweitern von Klassen Überladen von Methoden Überschreiben von

Mehr

Einführung in die Programmierung für NF. Vererbung

Einführung in die Programmierung für NF. Vererbung Einführung in die Programmierung für NF Vererbung Ziele Vererbungsprinzip der objektorien=erten Programmierung verstehen und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden

Mehr

1 Fragen aus dem Unterricht zu Projekt Garten

1 Fragen aus dem Unterricht zu Projekt Garten Kapitel 1z Grundlagen der Objektorientierung Seite 1 1 Fragen aus dem Unterricht zu Projekt Garten In diesem Zusatzkapitel werde ich Probleme ansprechen, die sich im Laufe des Unterrichtsgesprächs ergeben

Mehr

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Grundzüge der Programmierung. Wiederverwendung VERERBUNG Grundzüge der Programmierung Wiederverwendung VERERBUNG Inhalt dieser Einheit Syntax: Vererbung in Java Superklassen - Subklassen Konstruktorenaufruf in Subklassen super, abstract und final 2 Code-Reuse

Mehr

Programmiertechnik Objektorientierung

Programmiertechnik Objektorientierung Programmiertechnik Objektorientierung Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1 Was ist Objekt-Orientierung? Objekt-Orientierung (OO) ist nicht völlig scharf definiert, d.h. es gibt unterschiedliche

Mehr

Vererbung. Prof. Dr.-Ing. Thomas Schwotzer

Vererbung. Prof. Dr.-Ing. Thomas Schwotzer Vererbung Prof. Dr.-Ing. Thomas Schwotzer 1 Einführung Bisher haben wir uns mit Klassen und Objekten beschäftigt. Das Konzept bestand darin, dass Methoden und Membervariable in einer Struktur zusammen

Mehr

1 Klassen und Objekte

1 Klassen und Objekte 1 Klassen und Objekte Datentyp - Spezifikation des Typs von Datenobjekten Datenstruktur - logische Ordnung von Elementen eines Datentyps - zur (effizienten) Speicherung, Verwaltung, Zugriff - auf die Elemente

Mehr

Durch die Möglichkeit, Ein- und Ausgaben auf der Konsole durchzuführen, kann man auch systematisch das Verhalten von Klassen analysieren.

Durch die Möglichkeit, Ein- und Ausgaben auf der Konsole durchzuführen, kann man auch systematisch das Verhalten von Klassen analysieren. Durch die Möglichkeit, Ein- und Ausgaben auf der Konsole durchzuführen, kann man auch systematisch das Verhalten von Klassen analysieren. 267 Das hier skizzierte Problem basiert auf der strategischen Entscheidung

Mehr

Objektorientierte Programmierung (OOP)

Objektorientierte Programmierung (OOP) orientierte Programmierung (OOP) 1. Motivation Die objektorientierte Sichtweise der Welt Als Motivation für die OOP sieht man sich am besten die reale Welt an: Die reale Welt besteht aus "en", z. B.: Gegenstände,

Mehr

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Objektorientierung Was ist Objektorientierung Es einige Grundprinzipien, die (fast) allen Definitionen des Begriffs Objektorientierung

Mehr

Objektorientierung. Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik

Objektorientierung. Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik Organisatorisches Im Web unter http://www.uni-ulm.de/psh Vorwissen Du kannst bereits Klassen als Typen mit statischen

Mehr

Theorie zu Übung 8 Implementierung in Java

Theorie zu Übung 8 Implementierung in Java Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept

Mehr

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen Klassenvariablen Wir wollen die Zahl der instantiierten Studentenobjekte zählen. Dies ist jedoch keine Eigenschaft eines einzelnen Objektes. Vielmehr gehört die Eigenschaft zu der Gesamtheit aller Studentenobjekte.

Mehr

Präsentation Interfaces

Präsentation Interfaces Einführung in Java Präsentation Interfaces Nozar Delassaei Marvi Inhalt 1. Erinnerung Klasse Objekte Beispiel Klasse Abstrakte Klasse Beispiel Abstrakte Klasse Mehrfachvererbung-1 Mehrfachvererbung-2 2.

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 34 1 Definition von Klassen 2 Methoden 3 Methoden

Mehr

Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1

Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1 Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1 Kapitel 1: Die ersten Schritte mit Greenfoot 1 Starten Sie Greenfoot. (Wenn Sie Greenfoot das erste Mal öffnen, erscheint ein Dialogfenster,

Mehr

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode: Klassenvariablen Klassenmethoden Wir wollen die Zahl der instantiierten Studentenobjekte zählen. Dies ist jedoch keine Eigenschaft eines einzelnen Objektes. Vielmehr gehört die Eigenschaft zu der Gesamtheit

Mehr

Programmieren I. Kapitel 8. Vererbung

Programmieren I. Kapitel 8. Vererbung Programmieren I Kapitel 8. Vererbung Kapitel 8: Vererbung Ziel: Wesentliches objektorientiertes Konzept kennenlernen Subtypen Idee Probleme und Varianten Vererbung in Java dynamische Bindung abstrakte

Mehr

Informatik 10 Objektorientiertes Modellieren und Programmieren mit Java

Informatik 10 Objektorientiertes Modellieren und Programmieren mit Java Informatik 10 Objektorientiertes Modellieren und Programmieren mit Java 1. Klassen und Objekte Zunächst wollen wir mit Hilfe eines Miniprogramms die Entwicklungsumgebung BlueJkennen lernen. Die Installation

Mehr

Vererbung und Polymorphie

Vererbung und Polymorphie Vererbung und Polymorphie Marc Satkowski, Sascha Peukert 29. September 2016 C# Kurs Gliederung 1. Methodenüberladung 2. Vererbung Polymorphie Methoden- & Eigenschaftsüberschreibung Weitere Schlüsselwörter

Mehr

Statische Methoden, Vererbung, Benutzereingabe

Statische Methoden, Vererbung, Benutzereingabe Statische Methoden, Vererbung, Benutzereingabe Philipp Wendler Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung https://www.sosy-lab.org/teaching/2017-ws-infoeinf/

Mehr

Einführung in die Programmierung mit BlueJ

Einführung in die Programmierung mit BlueJ Einführung in die Programmierung mit BlueJ Thema 4 Steuerstrukturen - Verzweigungen Dr. Henry Herper Otto-von-Guericke-Universität Magdeburg - WS 2012/13 Daten speichern: Datenfelder Instanzvariablen,

Mehr

7.5 Mit bunten Kreisen spielen

7.5 Mit bunten Kreisen spielen Workshop (fakultativ) 7.5 Mit bunten Kreisen spielen In diesem fakultativen Workshop wollen wir mit Objekt-Arrays arbeiten. Sie erinnern sich an die Klasse Kreis, die wir in der Folge 5 konstruiert hatten.

Mehr