© APSIS GmbH , Polling, 2008
zum Kapitel 4.
Übung 4.1: Implementieren Sie den Datenbehälter ToleranterEimer mit Hilfe der Klasse lehrbuch.Eimer. Wie schon angemerkt, ist die Erste fehlertolerant, d.h. die von lehrbuch.Eimer ausgelösten Ausnahmen müssen innerhalb den Methodenrümpfen von ToleranterEimer aufgefangen werden. Als Maßnahme im Fehlerfall können Sie die Methode meldung mit einem Zeichenkettenparameter aus der Klasse lehrbuch.Eimer aufrufen: Diese gibt eine entsprechende Fehlermeldung im Fenster aus.
Testen Sie Ihre Klasse mit Hilfe des Programms (2.26).
Übung 4.2: Implementieren Sie einen statischen Datenbehälter EinDoppelEimer mit Hilfe von lehrbuch.Eimer. Die Methoden wie fuellen und entleeren sollen jeweils zwei Eimer bedienen. Selbstverständlich entwickeln Sie dazu auch ein Testprogramm (main), in dem Sie die Methoden der Klasse aufrufen, um ihre Wirkung zu überprüfen.
Die Dokumentation der Klasse EinDoppelEimer enthält folgende Methodenprofile:
public class EinDoppelEimer { // stellt zwei leere Datenbehälter zur Verfügung, die zusammen bedient werden public static void fuellen() throws VollException; // beide Eimer werden gefüllt public static void entleeren() throws LeerException; // beide werden entleert public static void anzeigen(); // beide Eimer werden im Fenster angezeigt }
Übung 4.3: In der Übung 4.2 haben Sie die Ausnahmen von der Klasse Eimer übernommen und einfach weitergereicht. Im Testprogramm mussten Sie diese auffangen. Fertigen Sie nun eine Version Ihrer Klasse EinDoppelEimer an, die ungeprüfte Ausnahmen auslöst. Zeigen Sie, dass Sie im Testprogramm die Freiheit haben, diese aufzufangen oder nicht.
Übung 4.4: An einem Werksgelände werden die Tore mit Hilfe von Java-Programmen gesteuert. Hierzu wurde die Datenbehälterklasse Tor entwickelt. Die Profile ihrer Methoden sind:
public class Tor { public Tor(String identifikation); public void schliessen() throws GeschlossenException; public void oeffnen() throws GeoeffnetException; }
Beim Erzeugen eines Tor-Objekts muss also eine identifizierende Zeichenkette (z.B. "A34B15#42") angegeben werden, mit deren Hilfe über die Leitung die Verbindung zur Torsteuerung hergestellt wird. Das neu erzeugte Tor-Objekt ist im geöffneten oder geschlossenen Zustand, je nach dem, was die Steuerung meldet.
Auf dem Werksgelände befinden sich auch Doppeltore (mit einem rechten und linken Flügel). Schreiben Sie nun eine (nicht-tolerante) Datenbehälterklasse Doppeltor mit denselben drei Methoden, die aber zwei Tor-Objekte gleichzeitig bedienen. Die Doppeltor-Objekte sollen beide Tore in geschlossenem Zustand erzeugen (try-catch im Konstruktor).
Schreiben Sie auch ein Hauptprogramm mit drei Doppeltor-Objekten und eine Methode. Diese öffnet das Doppeltor, das in ihrem Parameter angegeben wurde, und schließt es dann wieder. Rufen Sie die Methode mit den drei Doppeltor-Objekten auf.
Zeichnen Sie die Datenstruktur des Programms (alle Objekte und alle Referenzen, die auf sie zeigen).
Übung 4.5: Entwickeln Sie die Klasse MischEimer fertig und testen Sie sie mit drei Objekten: Beobachten Sie die Wirkung der Methoden und erklären Sie den Ablauf Ihres Programms.
Übung 4.6: Implementieren Sie zweimal die folgende Schnittstelle mit Hilfe der Klasse lehrbuch.Eimer – ähnlich wie das Programm (4.5) auf Seite 79:
public interface IDoppelEimer { public void anzeigen(); // Eimer werden angezeigt public void fuellen() throws lehrbuch.VollException; // beide Eimer werden gefüllt public void entleeren() throws lehrbuch.LeerException; // beide werden entleert }
In der ersten Implementierung dieser Schnittstelle füllen und entleeren Sie zuerst den linken, in der zweiten zuerst den rechten Eimer. (Beachten Sie, dass die Position auf dem Bildschirm beim Aufruf von anzeigen vergeben wird, nicht beim Erzeugen des Eimer-Objekts.)
Erstellen Sie – selbstverständlich – auch ein Testprogramm dazu.
Übung 4.7: Erweitern Sie die Klasse lehrbuch.Eimer um einen Konstruktor, der den erzeugten Eimer anzeigt und seine geschützte Methode fuellenMitWein aufruft. Schreiben Sie auch ein Testprogramm, in dem Sie drei Eimer unterschiedlicher Klassen anlegen und Methoden ausführen.
Übung 4.8: Schreiben Sie eine leere Klasse mit einem leeren private Konstruktor. Versuchen Sie, diese Klasse in einer anderen Klasse auszuprägen, und versuchen Sie diese Klasse (leer) zu erweitern. Erklären Sie die Meldungen des Compilers.
Wiederholen Sie diesen Vorgang mit einem protected Konstruktor und setzen Sie die Klasse in ein anderes Paket. Erklären Sie das Verhalten des Compilers.
Übung 4.9: In der Übung 4.7 haben Sie die Klasse lehrbuch.Eimer erweitert. Zeigen Sie in einem Programm, dass Objekte dieser Klasse auch von Referenzen der Oberklasse referenziert werden und als Parameter der Oberklasse übergeben werden können.
Übung 4.0: In der Übung 4.9 haben Sie die implizite Aufwärtskompatibilität nachgewiesen. Zeigen Sie jetzt in einem Programm, dass es umgekehrt nicht geht: Objekte der Oberklasse können von keinen Referenzen der Unterklasse referenziert werden. Rufen Sie eine Methode der Unterklasse für eine Referenz der Oberklasse mit expliziter Typkonvertierung auf. Untersuchen Sie, wie der Interpreter reagiert, wenn Sie absichtlich einen Fehler machen und ein Objekt der Oberklasse als Parameter der Unterklasse übergeben. Fangen Sie die erhaltene Ausnahme java.lang.ClassCastException in einem geschützten Block auf.
Verfolgen Sie den Ablauf Ihres Programms. Erleichtern Sie die Verfolgung mit Hilfe von Ausgaben mit System.out.println.
Übung 4.11: Demonstrieren Sie Polymorphie mit Kreisen. Entwickeln Sie drei Unterklassen von lehrbuch.Kreis, in denen Sie die Methode bemalen überschreiben. Hierin melden Sie (z.B. mit der Klassenmethode Kreis.meldung) vor dem Aufruf der geerbten Methode, welche Version gerade ausgeführt wird. Speichern Sie in einer Referenz der Oberklasse Kreis Adressen von vier Kreisobjekten unterschiedlicher Klassen nacheinander und rufen Sie für sie die überschriebene Methode bemalen auf. Verfolgen Sie den Ablauf und erklären Sie, wann welche Version ausgeführt wird.
Schreiben Sie auch eine Methode mit einem Parameter der Klasse Kreis. Rufen Sie hierin die Methode bemalen auf. Rufen Sie Ihre Methode viermal auf und übergeben Sie als Parameter Ihre vier Kreisobjekte unterschiedlicher Klassen. Verfolgen Sie den Ablauf und erklären Sie, wann welche Version der Methode bemalen ausgeführt wird.
Übung 4.12: In der Übung 4.6 haben Sie zwei Klassen entwickelt, die dieselbe Schnittstelle DoppelEimer implementieren.
Schreiben Sie nun ein neues Testprogramm dazu; vereinbaren Sie hier eine Methode mit einem Parameter vom Schnittstellentyp. Übergeben Sie ihr je ein Objekt Ihrer beiden Klassen und beobachten Sie dabei die Polymorphie.
Übung 4.13: Untersuchen Sie die Dokumentation der Klassen Checkbox, Choice, Label, TextField und TextArea des Standardpakets java.awt und schreiben Sie ein Applet, in dem Objekte dieser Klassen mit Daten (Zeichenketten) beschrieben werden. Verändern Sie zur Laufzeit die Größe des Appletfensters und beobachten Sie die Anordnung Ihrer Objekte darin: Dieses Verhalten ist charakteristisch für FlowLayout (s. Kapitel 5.6.).
© APSIS GmbH , Polling, 2008