Algorithmen und Datenstrukturen Sommersemester 2010 FAU, Informatik 2, AUD-Team [email protected] 4. Übung Abgabe bis 24.05.2010, 10:00 Uhr Aufgabe 4.1: Referenzen 16 Punkte Geben Sie Ihre Lösung als Referenzen.pdf ab. a) Führen Sie einen Schreibtischlauf des folgenden Java-Programms durch. Es werden insgesamt drei Instanzen der Klasse Counter erzeugt. Notieren Sie in tabellarischer Form die Objekte (Instanzen), auf die die Referenzvariablen a - e sowie globalCounter an den durch “<x>” gekennzeichneten Stellen zeigen. Notieren Sie des Weiteren den Wert der Variable count der jeweiligen Objekte. Beispiel: Pos. <1> <2> ... a Obj0 Obj0 ... b Obj1 ... c d - - ... ... e globalCoutner null null ... ... Obj0.count 4 2 ... Obj1.count ... Obj2.count ... b) Notieren Sie die Konsolenausgabe des Programms. c) Begründen Sie in höchstens zwei kurzen Sätzen das Ergebnis des Vergleichs e == Counter.getGlobal() in Zeile 18. d) Erläutern Sie in höchstens drei kurzen Sätzen welche Bedingungen ein übergebenes Objekt erfüllen muß, damit die Methode equals der Klasse Counter true zurückgibt. 1 p u b l i c c l a s s App { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { 3 C o u n t e r a = new C o u n t e r ( 4 ) ; 4 / / <1> 5 C o u n t e r b = new C o u n t e r ( 2 ) ; 6 / / <2> 7 Counter c = a ; 8 Counter d = Counter . getGlobal ( ) ; 9 Counter e = b ; 10 / / <3> 11 b = null ; 12 d . inc ( ) ; 13 e . inc ( ) ; 14 a . inc ( ) ; 15 / / <4> 16 Counter . getGlobal ( ) . inc ( ) ; 17 / / <5> 18 System . o u t . p r i n t l n ( e == C o u n t e r . g e t G l o b a l ( ) ) ; 19 System . o u t . p r i n t l n ( e . e q u a l s ( C o u n t e r . g e t G l o b a l ( ) ) ) ; 20 } 21 } Fortsetzung auf Seite 2! -1- Algorithmen und Datenstrukturen Sommersemester 2010 FAU, Informatik 2, AUD-Team [email protected] 1 c l a s s Counter { 2 p r i v a t e f i n a l s t a t i c i n t GLOBAL_COUNTER_START = 1 ; 3 4 private s t a t i c Counter globalCounter = null ; 5 6 private int count ; 7 8 public s t a t i c Counter getGlobal ( ) { 9 i f ( g l o b a l C o u n t e r == n u l l ) 10 g l o b a l C o u n t e r = new C o u n t e r (GLOBAL_COUNTER_START ) ; 11 return globalCounter ; 12 } 13 14 public Counter ( i n t s t a r t ) { 15 t h i s . count = s t a r t ; 16 } 17 18 public int getCount ( ) { 19 return t h i s . count ; 20 } 21 22 public void inc ( ) { 23 ++ t h i s . c o u n t ; 24 } 25 26 public boolean e q u a l s ( Object obj ) { 27 i f ( o b j == n u l l ) { 28 return f a l s e ; 29 } e l s e i f ( obj instanceof Counter ) { 30 r e t u r n ( ( C o u n t e r ) o b j ) . g e t C o u n t ( ) == g e t C o u n t ( ) ; 31 } else { 32 return f a l s e ; 33 } 34 } 35 36 public String t o S t r i n g ( ) { 37 return S t r i n g . valueOf ( t h i s . count ) ; 38 } 39 } Aufgabe 4.2: Überladen 8 Punkte In einer Java-Klasse können verschiedene Methoden mit gleichem Bezeichner enthalten sein. Es ist die folgende Methode gegeben: (∗) public f l o a t maximum ( f l o a t a , f l o a t b ) Überprüfen Sie nun für die folgenden Methoden, ob es sich jeweils um eine zulässige Überladung der Methode (∗) handelt und begründen Sie Ihre Antwort jeweils kurz. Geben Sie Ihre Lösungen als Overloading.pdf ab. -2- Algorithmen und Datenstrukturen Sommersemester 2010 (a) (b) (c) (d) (e) (f) (g) (h) public public public public float float char float float private long public float public float maximum ( i n t maximum ( ) maximum ( f l o a t maximum ( f l o a t maximum ( f l o a t maximum ( f l o a t maximum ( f l o a t maximum ( char Aufgabe 4.3: Fahrzeuge FAU, Informatik 2, AUD-Team [email protected] x , int y) a, x, i, i, i, i, b) y) j) j) j , float k) j) float float float float float float 36 Punkte Laden Sie sich zunächst die Vorgabe Fahrzeuge.zip herunter und entpacken Sie diese. Übersetzen Sie nun die Datei VehicleTest.java. Das Testprogramm sollte fehlerfrei übersetzen, zeigt aber noch keine sinnvolle Ausgabe an. a) Implementieren Sie zunächst einen weiteren Konstruktor für die Klasse Vehicle. Dieser soll den Fahrzeugtyp (also beispielsweise UNKOWN, PKW, LKW) als int entgegennehmen und in das entsprechende Feld der Klasse schreiben. Eine Überprüfung des übergebenen Fahrzeugtyps ist nicht vorgesehen. b) Implementieren Sie anschließend für jede Unterklasse von Vehicle einen Konstruktor, der den Superkonstruktor der Klasse Vehicle aufruft und den entsprechenden Fahrzeugtyp übergibt. Verwenden Sie hierzu die Konstanten aus der Klasse Vehicle. Anschließend sollte VehicleTest folgende Ausgabe erzeugen: -- (1; --, --) -- (2; --, --) c) Überschreiben Sie die Methoden honk(), fuel() und typeName() in den Klassen Pkw und Lkw. Das Hupen des Lkw’s soll dem String “moeoep” entsprechen, das des Pkw’s dem String “tuuut”. Der Lkw tankt “Diesel” während der Pkw “Bleifrei” tankt. Die Typ-Namen der beiden Fahrzeugklassen entsprechen genau den Namen der jeweiligen Konstanten in der Klasse Vehicle. Anschließend sollte java VehicleTest folgende Ausgabe erzeugen: PKW (1; tuuut, Bleifrei) LKW (2; moeoep, Diesel) d) Da wir in der Klasse Vehicle einen extra Konstruktor implementiert haben, der das Feld type initialisiert, benötigen wir den Standard-Konstruktor nicht mehr. Entfernen Sie diesen, Ihr Program sollte nach wie vor kompilieren! e) Die Klasse Vehicle selbst sollte nie direkt instanziiert werden. Um das auch in unserem Quelltext wiederzuspiegeln, ändern Sie den verbliebenen Konstruktor der Klasse Vehicle so ab, dass dieser nur noch von den Unterklassen der Klasse Vehicle aufgerufen werden kann. -3- Algorithmen und Datenstrukturen Sommersemester 2010 FAU, Informatik 2, AUD-Team [email protected] f) Da die Methoden fuel(), honk() und typeName() nun in den Unterklassen von Vehicle implementiert wurden, können die entsprechenden Stubs (Stümpfe) dieser Methoden in der Klasse Vehicle in abstrakte Methoden umgewandelt werden. Führen Sie die nötigen Änderungen durch. Ändern Sie auch den Kopf der Klasse entsprechend, wenn nötig. g) Wir wollen die möglichen Fahrzeugtypen nun um den Monstertruck erweitern. Erstellen Sie eine Klasse Monstertruck die von Vehicle erbt. Legen Sie des weiteren eine neue Konstante für diesen Fahrzeugtyp namens MONSTERTRUCK an. Ein Aufruf der Methode toString() der Klasse Monstertruck muss in folgender Ausgabe resultieren: MONSTERTRUCK (3; roar, Kerosin) Die toString() Methoden dürfen hierzu nicht verändert oder überladen werden! h) Verschiedene Fahrzeuge können natürlich auch mit unterschiedlichen Komponenten geliefert werden. Zunächst müssen Schnittstellen zu möglichen Komponenten definiert werden. Erstellen Sie hierzu eine Schnittstelle namens NavigationSystem. Diese Schnittstelle erlaubt den Zugriff auf ein Navigationssystem. Die Schnittstelle NavigationSystem enthält die Methode void setDeparture(String location) und die Methode void setDestination(String destination). Definieren Sie diese Schnittstelle in der Datei NavigationSystem.java. i) Wir werden jetzt einen neuen Pkw einführen der über ein Navigationssystem verfügt. Dieser wird in der Klasse PkwWithNavi implementiert, die wiederum von Pkw erbt und die Schnittstelle NavigationSystem implementiert. Die Orte, die den Methoden setDeparture() und setDestination() übergeben werden, sollen in Feldern der Klasse PkwWithNavi gespeichert werden. Legen Sie hierzu die Felder departure und destination mit korrektem Typ an. Die Felder müssen so geschützt werden, dass nur Methoden der Klasse PkwWithNavi darauf zugreifen können. Implementieren Sie die genannten Erweiterungen in der Datei PkwWithNavi.java. j) Ändern Sie den Quelltext in der Datei VehicleTest.java so ab, dass zusätzlich ein PkwWithNavi und ein Monstertruck instanziiert werden. Setzen Sie anschließend eine Navigationsroute von “Hamburg” nach “Berlin” für die Instanz der Klasse PkwWithNavi. Abschließend sollen beide Objekte mittels toString ausgegeben werden. k) Zu guter Letzt soll ein Aufruf der toString() Methode eines Objekts der Instanz PkwWithNavi den momentanen Navigationsstatus ausgeben. Überschreiben Sie dazu die toString() Methode in der Klasse PkwWithNavi, sodass diese folgenden Text zurückgibt (für die Route Hamburg - Berlin): PKW (1; tuuut, Bleifrei): Navigiere von Hamburg nach Berlin Nachdem Sie alles korrekt implementiert haben, sollte VehicleTest folgende Ausgabe erzeugen: -4- Algorithmen und Datenstrukturen Sommersemester 2010 FAU, Informatik 2, AUD-Team [email protected] PKW (1; tuuut, Bleifrei) LKW (2; moeoep, Diesel) PKW (1; tuuut, Bleifrei): Navigiere von Hamburg nach Berlin MONSTERTRUCK (3; roar, Kerosin) Geben Sie die Dateien Lkw.java, Monstertruck.java, NavigationSystem.java, Pkw.java, Vehicle.java, PkwWithNavi.java sowie VehicleTest.java als Ihre Lösung ab. 60 Punkte -5-