Übungsleiter: Markus Raab

Musterlösung Test 3

Musterlösung Test 3 Aufgabe 1: Cowboy Listing 1: Cowboy

5

10

class Cowboy { public String rope ( Cowboy that ) { if ( this == that ) { return exclaim (); } else { return " Caught " ; } } public String exclaim () { return " Yeah " ; } }

Die Klasse Cowboy besitzt zwei Methoden: rope(Cowboy that), die untersucht, ob es sich beim übergebenen Parameter „that“ um das gleiche Objekt, das diese Methode aufgerufen hat, handelt. Es wird auf Identität und nicht auf Gleichheit überprüft. Sind „this“ und „that“ identisch, so wird exclaim() aufgerufen, sonst wird ein String retourniert. Die Methode exclaim() gibt einen String zurück. Listing 2: Woody

5

class Woody extends Cowboy { public String exclaim () { return " Jupiee " ; } }

Woody erweitert die Klasse Cowboy mittels „extends“. Das bedeutet, dass Woody ein Untertyp von Cowboy ist. Diese Klasse überschreibt folgende Methode: exclaim(): Wie im Obertyp Cowboy, gibt diese Methode einen String zurück, der anders als der String in der Oberklasse ist. Des Weiteren hat diese Klasse Zugriff auf alle Methoden der Oberklasse, die nicht private sind. Listing 3: Cowboytest public class Cowboytest {

185.A02

Grundlagen der Programmkonstruktion

Seite 1 von 6

Übungsleiter: Markus Raab

Musterlösung Test 3

public static void main ( String [] args ) { Cowboy w = new Woody (); Cowboy c = new Cowboy (); 5

// 1. System . out . println ( w . rope ( w )); // 2. System . out . println ( w . rope ( c )); // 3. System . out . println ( c . rope ( w )); // 4. System . out . println ( c . rope ( c )); }

10

15

}

1. Die Ausgabe ergibt „Jupiee“. Objekt w hat zwar den deklarierten Typ Cowboy, ist allerdings tatsächlich ein Objekt von Woody. Dies erklärt, warum der Befehl „w.rope(w)“ die Methode „exclaim()“ in Woody aufruft und nicht in Cowboy. 2. Die Ausgabe ergibt „Caught“. Das Object c ist vom Typ Cowboy. Beim Aufruf der Methode „w.rope(c)“ wird klar, dass w und c nicht identisch sind und der else-Zweig der Methode ausgeführt wird. 3. Die Ausgabe ergibt „Caught“ und ist analog zu 2. 4. Die Ausgabe ergibt „Yeah“ und ist analog zu Fall 1 mit dem Unterschied, dass Objekt c und nicht Objekt w die Methode aufruft.

Aufgabe 2: Fliegendes Object Listing 4: FliegendesObjekt

5

10

class FliegendesObjekt { public String starten ( FliegendesObjekt that ) { if ( this == that ) { return " Gestartet " ; } else { return landen (); } } public String landen () { return " Crash " ;

185.A02

Grundlagen der Programmkonstruktion

Seite 2 von 6

Übungsleiter: Markus Raab

Musterlösung Test 3

} }

Die Klasse FliegendesObjekt besitzt zwei Methoden: starten(FliegendesObjekt that): Untersucht, ob es sich beim übergebenen Parameter „that“ um das gleiche Objekt, das diese Methode aufgerufen hat, handelt. Es wird auf Identität und nicht auf Gleichheit überprüft. Sind „this“ und „that“ identisch, so wird ein String retourniert, sonst wird landen() aufgerufen. Die Methode landen() gibt einen String zurück. Listing 5: Flugzeug

5

class Flugzeug extends FliegendesObjekt { public String landen () { return " Hui " ; } }

Flugzeug erweitert die Klasse FliegendesObjekt mittels „extends“. Das bedeutet, dass Flugzeug ein Untertyp von FliegendesObjekt ist. Diese Klasse überschreibt folgende Methode: landen(): Wie im Obertyp FliegendesObjekt, gibt diese Methode einen String zurück, der anders als der String in der Oberklasse ist. Des Weiteren hat diese Klasse Zugriff auf alle Methoden der Oberklasse, die nicht private sind. Listing 6: FliegendesObjektTest public class F l i e g e n d e s O b j e k t T e s t { public static void main ( String [] args ) { FliegendesObjekt o = new Flugzeug (); FliegendesObjekt f = new FliegendesObjekt (); 5

// 1. System . out . println ( o . starten ( f )); // 2. System . out . println ( o . starten ( o )); // 3. System . out . println ( f . starten ( f )); // 4. System . out . println ( f . starten ( o ));

10

} 15

}

185.A02

Grundlagen der Programmkonstruktion

Seite 3 von 6

Übungsleiter: Markus Raab

Musterlösung Test 3

1. Die Ausgabe ergibt „Hui“. Objekt o wurde als FliegendesObjekt deklariert, ist aber vom dynamischen Typ her ein Flugzeug. Beim Aufruf der Methode „starten“ wird f - vom Typ FliegendesObjekt - als Parameter übergeben. Die Überprüfung auf Identität gibt false zurück und es wird die Methode „landen“ in Flugzeug aufgerufen. 2. Gestartet Objekt o ruft die Methode „starten“ auf und übergibt sich selbst als Argument. Die Überprüfung auf Identität gibt true zurück und ein String wird ausgegeben. 3. Die Ausgabe ergibt „Gestartet“ und ist analog zu Fall 2. 4. Die Ausgabe ergibt „Crash“. Der Aufruf ist analog zu Fall 1, mit dem Unterschied, dass die Methode „landen“ im Obertyp aufgerufen wird.

Aufgabe 3: Konzert Listing 7: Konzert public class Konzert { String band ; int jahr ; String ort ; 5

10

15

20

Konzert ( String band = b ; jahr = j ; ort = o ; } public boolean if ( that == return

b , int j , String o ) {

equals ( Object that ) { null ) false ;

// Parameter ist vom Typ Konzert if ( that instanceof Konzert ) { // Casten, um auf Objektvariablen // zugreifen zu können Konzert z = ( Konzert ) that ; return this . band . equals ( z . band ) && this . jahr == z . jahr && this . ort . equals ( z . ort );

25

185.A02

}

Grundlagen der Programmkonstruktion

Seite 4 von 6

Übungsleiter: Markus Raab

Musterlösung Test 3

return false ; } public static void main ( String [] args ) { Konzert k1 = new Konzert ( " Nomeansno " ,2011 , " Arena " ); Konzert k2 = new Konzert ( " Nomeansno " ,2011 , " Arena " ); Konzert k3 = new Konzert ( " Nomeansno " ,1991 , " Arena " ); assert k1 . equals ( k2 ); assert k1 . equals ( k3 )== false ; assert k1 . equals ( new Integer (3))== false ; assert k1 . equals ( null )== false ; }

30

35

}

Beim Vergleich schließen wir gleich am Anfang aus, dass das übergebene Objekt null ist, falls dieser Fall zutreffen sollte, geben wir false zurück. Falls sich das Objekt beim Aufruf selbst als Parameter übergibt, sind die Objekte identisch und dadurch folgt, dass sie logischerweise auch gleich sind, wir geben in diesem Fall also true zurück. Falls keiner der zwei Fälle zutrifft, überprüfen wir erst, ob das zu vergleichende Objekt vom Typ Konzert ist und casten dieses, um auf die Variablen und Methoden zugreifen zu können. Anschließend können wir überprüfen, ob alle Variablen in this und that den gleichen Wert haben. Die Variablen „band“ und „ort“ sind vom Typ String, was wiederum Referenztypen bzw. Objekte sind, daher müssen wir für diese die Methode „equals“ aufrufen, die die String Werte der Variablen auf Gleichheit überprüft. Falls keiner dieser Fälle eintritt, was zum Beispiel dann eintritt, wenn das übergebene Object „that“ nicht vom Typ Konzert ist, wird per default „false“ zurückgegeben.

Aufgabe 4: Zeitschrift Listing 8: Zeitschrift

5

public class Zeitschrift { String name ; int jahr ; int ausgabe ; Zeitschrift ( String n , int j , int a ) { name = n ; jahr = j ;

185.A02

Grundlagen der Programmkonstruktion

Seite 5 von 6

Übungsleiter: Markus Raab

Musterlösung Test 3

ausgabe = a ; } public boolean equals ( Object that ) { // Parameter ist NULL und es gibt nichts zu vergleichen if ( that == null ) return false ;

10

// this und that sind identisch if ( this == that ) return true ;

15

// Parameter ist vom Typ Zeitschrift if ( that instanceof Zeitschrift ) { // Casten, um auf Objektvariablen zugreifen zu können Zeitschrift z = ( Zeitschrift ) that ;

20

return this . name . equals ( z . name ) && this . jahr == z . jahr && this . ausgabe == z . ausgabe ;

25

} return false ; }

30

public static void main ( String [] args ) { Zeitschrift z1 = new Zeitschrift ( " c ’t " ,2014 ,14); Zeitschrift z3 = new Zeitschrift ( " c ’t " ,2014 ,9); // assert in Java entspricht dem in Forth assert z1 . equals ( new Zeitschrift ( " c ’t " ,2014 ,14)); assert z1 . equals ( z3 )== false ; assert z1 . equals ( new Integer (3))== false ; assert z1 . equals ( null )== false ; }

35

40

}

Analog zu „Konzert“. Wir führen ebenfalls den Vergleich auf null und Identität durch und wollen wissen, ob der übergebene Parameter „that“ überhaupt vom Typ „Zeitschrift“ ist, in dem Fall führen wir einen Cast durch und vergleichen alle Variablen.

185.A02

Grundlagen der Programmkonstruktion

Seite 6 von 6