Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in der Zeit vom 24.11. bis zum 03.12. beim Prüfungsamt anmelden. Das Prüfungsamt ist nur vormittags geöffnet. Für jeden Buchstaben (Nachname) gibt es jedoch nur einen einzigen Tag, an dem man sich anmelden kann! Bitte informiere dich über den Aushang an Tür LG015 und/oder über das Fachschaftsforum Informatik, an welchem Tag dein Buchstabe vorgesehen ist! Studierende anderer Fachrichtungen melden sich, soweit in ihrer Studienordnung nicht anders vorgesehen, per E Mail direkt bei uns an: programmierung@is.informatik.uni-duisburg.de Bitte Vorname, Nachname, Studienfach und Matrikelnummer angeben! Generelle Hinweise Bitte lies dir den Zettel (d.h. alle Aufgaben) schon vor der Übung gründlich durch! Versuche schon vor der Übung, die Aufgaben zu lösen, oder überlege dir wenigstens Lösungswege und/oder konkrete Fragen, die du stellen kannst! Aufgabe 11 kann größtenteils ohne Rechner gelöst werden, man braucht den Rechner nur zum Ausprobieren (bitte das Programm aus dem Netz herunterladen). Bei Aufgabe 12 kann man sich schon vorher überlegen, welche Instanzvariablen die Klassen haben müssen, welche Datentypen diese Variablen haben müssen, usw. Aufgabe 13 ist zum Weiterdenken. In der Übung werden wir davon ausgehen, dass du mindestens die Aufgaben 11 und 12 (so weit wie dir möglich) vorbereitet hast! Seite 1 von 5
Aufgaben Aufgabe 11: Vererbung und Polymorphie Gegeben sei der folgende Java Code: Listing 1: FahrzeugTest.java 1 c l a s s Fahrzeug extends Object { 2 Fahrzeug ( ) { 3 System. out. p r i n t l n ( " Ich kann fahren. " ) ; 4 } 5 } 6 c l a s s Auto extends Fahrzeug { 7 Auto ( ) { 8 System. out. p r i n t l n ( " Ich habe v i e r ärder. " ) ; 9 } 10 } 11 class SUV extends Auto { 12 SUV( ) { 13 System. out. p r i n t l n ( " Ich bin e i n n u t z l o s e r "+ 14 " B e n z i n f r e s s e r. " ) ; 15 } 16 } 17 public c l a s s FahrzeugTest { 18 19 public static void main ( S t r i n g [ ] args ) { 20 21 SUV suv = new SUV( ) ; 22 23 i f ( suv instanceof Fahrzeug ) 24 System. out. p r i n t l n ( 25 " Dies i s t e i n Fahrzeug. " ) ; 26 i f ( suv instanceof Auto ) 27 System. out. p r i n t l n ( 28 " Dies i s t e i n Auto. " ) ; 29 i f ( suv instanceof SUV) 30 System. out. p r i n t l n ( 31 " Dies i s t e i n SUV. " ) ; 32 } 33 } a) Überlege dir zuerst, ohne das Programm auszuprobieren: Was wird dieses Programm ausgeben? Warum? b) Teste das Programm nun. Entspricht das Ergebnis dem, was du erwartet hast? Seite 2 von 5
Aufgabe 12: Das Konzept Auto und dessen Spezialisierung Pickup Modelliere die folgenden Konzepte, indem du sie in den Klassen Auto, Pickup und AutoTest verwirklichst. Eigenschaften von Objekten dieser Klassen sollen ausschließlich beim Erzeugen gesetzt und ggf. durch Methoden verändert werden können. Auto: Ein Auto soll ein Kennzeichen, einen Kilometerstand und eine Anzahl Sitzplätze haben. Wenn nicht anders angegeben, so soll das Kennzeichen eines Auto Objektes standardmäßig DU-DAI 0815 lauten, es sollen aber natürlich auch Autos mit anderen Kennzeichen erzeugt werden können. Ein neu erzeugtes Auto hat grundsätzlich noch keine Kilometer gefahren. Wenn nicht anders angegeben, so hat ein Auto 5 Sitzplätze. Es sollen jedoch auch zweisitzige Autos erzeugt werden können. Zu guter Letzt hat ein Auto außerdem eine Antenne, die ausgefahren oder eingefahren sein kann. Die Klasse soll mindestens folgende Methoden besitzen: public String getkennzeichen(): liefert das Kennzeichen zurück public int getkilometerstand(): liefert den aktuellen Kilometerstand zurück public void fahre(int x): schreibt eine Meldung an die Standardausgabe, dass das Auto x Kilometer fährt, und setzt dann den Kilometerstand entsprechend weiter public void antenneeinfahren(): schreibt eine Meldung an die Standardausgabe, dass die Antenne eingefahren wird, und setzt den Status der Antenne public void antenneausfahren(): schreibt eine Meldung an die Standardausgabe, dass die Antenne ausgefahren wird, und setzt den Status der Antenne public boolean istantennedraussen(): liefert genau dann true, wenn die Antenne ausgefahren ist protected void vordemwaschen(): bereitet das Auto auf den Aufenthalt in der Waschstraße vor konkret bedeutet das bei einem Auto, dass die Antenne eingefahren wird public void waschen(): bereitet das Auto für eine Wagenwäsche vor und schreibt dann eine Meldung an die Standardausgabe, dass der Wagen gewaschen wird public int getsitzplaetze(): liefert die Anzahl Sitzplätze zurück public boolean equals(object o): ergibt genau dann true, wenn das Objekt o ebenfalls ein Auto ist, und wenn die beiden Kennzeichen gleich sind public String tostring(): gibt eine passende String Repräsentation des Autos zurück Seite 3 von 5
Pickup: Ein Pickup ist für unsere Zwecke eine spezielle Art von Auto. Anders als sonstige Autos hat es auf jeden Fall nur 2 Sitzplätze. Dafür hat es zusätzlich eine offene Ladefläche mit einem beim Erzeugen bestimmbaren Fassungsvermögen f. Die Ladefläche ist beim Erzeugen des Pickups zunächst leer und kann maximal mit f Dingen beladen werden. Die Klasse soll mindestens folgende Methoden besitzen: public boolean beladen(int x): falls auf der Ladefläche noch genügend Platz ist, wird der Inhalt der Ladefläche um x Dinge erhöht, eine passende Meldung an die Standardausgabe geschrieben, und true zurückgegeben, andernfalls false public void entladen(int x): falls auf der Ladefläche mindestens x Dinge vorhanden sind, wird der Inhalt der Ladefläche um x Dinge erniedrigt, eine passende Meldung geschrieben, und true zurückgegeben, andernfalls false protected void vordemwaschen(): bei einem Pickup soll vor dem Waschen nicht die Antenne eingefahren werden, sondern stattdessen die Ladefläche geleert werden public int getladung(): liefert die Anzahl Dinge, die derzeit auf der Ladefläche liegen, zurück, ohne den Ladezustand zu verändern public String tostring(): gibt eine passende String Repräsentation des Pickups zurück AutoTest: Diese Klasse ist ausschließlich zum Testen der Klassen Auto und Pickup da. Sie soll vom Java Interpreter ausgeführt werden können. Definiere also eine passende main Methode, in der mehrere verschiedene Autos und Pickups erzeugt werden. Dort sollte u.a. Folgendes geschehen: Lass dir die Kennzeichen und sonstigen Zustände der erzeugten Objekte ausgeben. Lass die Autos und Pickups fahren, waschen und teste sie untereinander auf Gleichheit. Teste die Beladelogik der Pickups. Hinweis: Der Modifikator protected bewirkt bei Methoden und Variablen, dass diese nur innerhalb der betreffenden Klasse und aller Klassen, die von ihr erben, sichtbar sind. Der Modifikator private dagegen bewirkt eine Sichtbarkeit nur innerhalb der betreffenden Klasse. Der Modifikator public bewirkt eine allgemeine Sichtbarkeit. Aufgabe 13: Erweitern eines Konzeptes um verwandte Klassen Auf Blatt 3 wurde die Klasse Buch erstellt, die ein Buch in einer Bibliothek modelliert. Den Quellcode für die Klasse Buch kannst du dir bei Bedarf aus dem Web herunterladen (siehe Musterlösung Blatt 3). Nun soll es in dieser Bibliothek außerdem auch Zeitschriften geben. Zeitschriften haben einen Titel, eine ISSN (statt ISBN!) und außerdem noch eine Ausgabennummer. Zwei Zeitschriften Seite 4 von 5
sind gleich, wenn die ISSN gleich ist. Zeitschriften sollen keine Bücher sein, und Bücher keine Zeitschriften. a) Welche Funktionalitäten und Eigenschaften sind nur bei Zeitschrift vorhanden, welche nur bei Buch, und welche haben beide Konzepte gemeinsam? b) Welche Klassen brauchst du mindestens, um die oben beschriebenen Bedingungen umzusetzen? Beachte insbesondere, dass Zeitschriften keine Bücher sein sollen, und Bücher keine Zeitschriften. Das bedeutet unter anderem, dass der Ausdruck zeitschrift1 instanceof Buch den Wert false haben soll, wenn die Variable zeitschrift1 vom Typ Zeitschrift ist. c) Welche Funktionalitäten und Eigenschaften kannst du aus der Klasse Buch in die anderen Klassen verschieben? d) Was fehlt dann noch in Buch und den anderen Klassen? e) Implementiere dein Konzept und teste es. Hinweis: Diese Aufgabe solltest du alleine lösen können. Versuche, der Reihe nach alle Fragen in den einzelnen Teilaufgaben zu beantworten. Implementiere danach die Klassen, die du entworfen hast. Seite 5 von 5