Informatik II Musterlösung

Ähnliche Dokumente
Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

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

Programmieren 2 Java Überblick

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Übungsstunde 9. Einführung in die Programmierung I

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Vorkurs Informatik WiSe 15/16

Prüfung Softwareentwicklung II (IB)

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Algorithmen und Datenstrukturen

Programmieren in Java -Eingangstest-

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Objektorientierung III

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmieren in Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Java

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Die Klasse java.lang.object. Thorsten Treffer

II.4.2 Abstrakte Klassen und Interfaces - 1 -

4. Vererbung Die Klasse Object. Die Klasse Object

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

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

Javakurs für Anfänger

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Informatik II Musterlösung

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

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

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Tag 8 Repetitorium Informatik (Java)

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Algorithmen und Datenstrukturen 07

Objektorientierte Programmierung Studiengang Medieninformatik

Programmierung für Mathematik HS11

Informatik II Übung 06. Benjamin Hepp 5 April 2017

II.4.4 Exceptions - 1 -

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Programmieren in Java

Javakurs für Anfänger

14 Abstrakte Klassen, finale Klassen, Interfaces

Probeklausur: Programmierung WS04/05

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

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

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

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

Kopieren und Vergleichen

Übungsblatt 7. Was ist die Ausgabe de facto? Entspricht die Ausgabe Ihren Erwartungen?

Programmieren in Java

14 Abstrakte Klassen, finale Klassen, Interfaces

Interfaces und Vererbung

3. Übungsbesprechung Programmkonstruktion

Vererbung, Polymorphie

Informatik II Übung 6

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

Tagesprogramm

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Programmieren in Java

II.4.1 Unterklassen und Vererbung - 1 -

Algorithmen und Datenstrukturen Sommersemester Übung Abgabe bis , 10:00 Uhr

Vererbung. Martin Wirsing. Ziele. Vererbung

II.4.5 Generische Datentypen - 1 -

Klausur: Java (Liste P)

Listing 1: Cowboy. Listing 2: Woody

Programmierkurs Java

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

Interfaces und Generics

Javakurs für Anfänger

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Kopieren und Vergleichen

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

1 Einleitung Generizität Syntax... 2

Meta Programming and Reflection in Java

Javakurs für Anfänger

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

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

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Universität Karlsruhe (TH)

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

Javakurs für Anfänger

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

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Programmierkurs Java

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Transkript:

Ludwig-Maximilians-Universität München SS 2006 Institut für Informatik Übungsblatt 8 Prof. Dr. M. Wirsing, M. Hammer, A. Rauschmayer Informatik II Musterlösung Zu jeder Aufgabe sind Dateien abzugeben, deren Namen rechts in der Aufgabenüberschrift stehen. Stellen Sie die Dateien in ein extra Verzeichnis (mit beliebigem Namen) und packen Sie dieses zu einem ZIP- Archiv. Geben Sie dieses, wie üblich, per UniWorx ab. Aufgabe 8-1 Auswertung (6 Punkte, auswertung.txt) Geben Sie für jedes der folgenden Java-Fragmente an, welchen Wert es ausgewertet ergibt bzw. welche Ausgabe erzeugt wird. Erklären Sie ausserdem das Ergebnis. Tipps: ˆ Mit dem folgenden Eclipse-Menübefehl können Sie eine sogenannte Scrapbook-Page-Datei anlegen. Der dazugehörige Editor erlaubt es einem, interaktiv Java-Befehle auszuführen. File New Other... Java Java Run/Debug Scrapbook Page ˆ Wenn Sie bei einem der Sprachmechanismen nicht genau Bescheid wissen, können Sie in der The Java Language Specification nachschlagen: http://java.sun.com/docs/books/jls/ a) new Integer(3) == new Integer(3) false, da unterschiedliche Objekte b) new Integer(3).equals(new Integer(3)) true, da equals() (in diesem Fall) auf Wertgleichheit und nicht auf Identität untersucht. c) int i=0; System.out.println(i++); System.out.println(++i); System.out.println(i); 0 2 2 Erklärung: Der Inkrement-Operator hat unterschiedliche Versionen; im ersten Fall wird der Wert vor dem Inkrement zurückgegeben, im zweiten Fall danach. d) String s = null; if (s==null s.length() == 0) { System.out.println("String ist leer"); if (s==null s.length() == 0) { System.out.println("String ist leer"); String ist leer java.lang.nullpointerexception... Erklärung: Im ersten Fall liegt Kurzschlussauswertung vor, die den zweiten Operand nur auswertet, wenn der erste false ist.

e) Object obj = new Integer(3); System.out.println(obj.getClass()); class java.lang.integer Erklärung: Die Klasse eines Objekts wird quasi als Instanzvariable vermerkt. Damit wird der exakte Typ eines Objekts dynamisch entschieden, was fürs dynamische Binden benötigt wird. f) String s1 = "Hallo"; String s2 = s1; s2 += " Welt!"; System.out.println(s1); System.out.println(s2); Hallo Hallo Welt! Erklärung: Strings werden niemals (destruktiv) verändert, sondern immer komplett neu erzeugt, wie in funktionalen Programmiersprachen. Aufgabe 8-2 Generische Paare (4 Punkte, Pair.java) Programmieren Sie generische Paare. a) Implementieren Sie eine Klasse Pair, die die Instanzvariablen key und value hat, deren Typen Parameter der Klasse sind. Die Klasse soll zwei Konstruktoren haben, einer lässt die Instanzvariablen unitialisiert, der andere setzt beide gemäß seiner Parameter. Schreiben Sie weiterhin Getter und Setter für beide Instanzvariablen. Hinweis: Im Gegensatz zur Vorlesung ist hier eine einzige Klasse (ohne Vererbung) zu implementieren, in der die Getter und Setter standardkonforme Namen haben. b) Verwenden Sie die folgende Klasse zum Testen Ihrer Implementierung: PairTester.java package pair; import java.util.arraylist; import java.util.collections; import java.util.comparator; import java.util.list; public class PairTester { public static void main(string[] args) { List<Pair<String, Double>> food = new ArrayList<Pair<String, Double>>(); food.add(new Pair<String, Double>("Geschnetzeltes", 7.0)); food.add(new Pair<String, Double>("Gemüselasagne", 5.5)); food.add(new Pair<String, Double>("Apfelkompott", 6.0)); Collections.sort(food, new NameComparator()); System.out.println("Sortiert nach Name:\n"+food); Collections.sort(food, new PriceComparator()); System.out.println("Sortiert nach Preis:\n"+food); private static class NameComparator implements Comparator<Pair<String, Double>> { public int compare(pair<string, Double> o1, Pair<String, Double> o2) { return o1.getkey().compareto(o2.getkey());

private static class PriceComparator implements Comparator<Pair<String, Double>> { public int compare(pair<string, Double> o1, Pair<String, Double> o2) { return o1.getvalue().compareto(o2.getvalue()); Sorgen Sie dafür, dass hierbei folgende Ausgabe erzeugt wird: Sortiert nach Name: [Pair(Apfelkompott, 6.0), Pair(Gemüselasagne, 5.5), Pair(Geschnetzeltes, 7.0)] Sortiert nach Preis: [Pair(Gemüselasagne, 5.5), Pair(Apfelkompott, 6.0), Pair(Geschnetzeltes, 7.0)] Pair.java package pair; public class Pair<Key,Val> { private Key key; private Val value; public Pair() { public Pair(Key key, Val value) { this.setkey(key); this.setvalue(value); public void setkey(key key) { this.key = key; public Key getkey() { return key; public void setvalue(val value) { this.value = value; public Val getvalue() { return value; public String tostring() { return String.format("Pair(%s, %s)", getkey(), getvalue()); //-------------------- // Für die Aufgabe ist es nicht zwingend, equals() zu implementieren; // würde man hingegen mit Mengen arbeiten, käme man um diesen Schritt // nicht herum, denn dort gilt es Duplikate zu eliminieren! /** * Whenever one overrides <code>equals()</code>, one also has to override * <code>hashcode()</code>! */ public boolean equals(object obj) { if (obj == null (! (obj instanceof Pair))) return false; Pair other = (Pair) obj;

return this.getkey().equals(other.getkey()) && this.getvalue().equals(other.getvalue()); public int hashcode() { return 3*getKey().hashCode() + getvalue().hashcode(); Aufgabe 8-3 Delegation (6 Punkte, SwimmingImpl.java, DrivingImpl.java, Car.java, Amphibious.java) Delegation ist ein Design-Pattern, das eng verwandt mit Vererbung ist: Wenn eine Klasse B die Methoden einer Klasse A übernehmen soll, setzt man bei Vererbung beide Klassen per B extends A in Beziehung. Bei Delegation werden ebenfalls (Instanzen) beide(r) Klassen in Beziehung gesetzt: B hat nun eine Instanzvariable a vom Typ A. Die in a enthaltene Instanz hat also sowohl den Zustand, als auch die Methoden, die man sich für Instanzen von B wünscht. Folglich muss man nur noch alle Methodenaufrufe, die A unterstützt, an a weiterleiten (engl. forwarding). Es gibt Programmiersprachen, die das automatisch erledigen. In Java muss man das von Hand machen, wird aber in Eclipse unterstützt über den Menübefehl Source Generate Delegate Methods... Im folgenden sehen Sie ein Beispiel für Delegation: a.m1() B + void m1() + void m2() a A + void m1() A.java package delegation; public class A { public void m1() { B.java package delegation; public class B { private A a = new A(); /** Übernommen von A per Delegation */ public void m1() { a.m1(); /** Eigene Methode dieser Klasse */ public void m2() { Zur Lösung des folgenden Problems ist (unter anderem) Delegation einzusetzen: Gegeben seien das leere Interface Vehicle und folgende Unter-Interfaces. Swimming.java

public interface Swimming extends Vehicle { public void swim(); Driving.java public interface Driving extends Vehicle { public void drive(); a) Erstellen Sie die Implementierungen SwimmingImpl von Swimming und DrivingImpl für Driving. Die Implementierungen der Methoden sollen einfach nur den Namen der aufgerufenen Methode ausgeben. b) Implementieren Sie eine Klasse Car, die die Implementierung von Driving nutzt. Hierfür können Sie ganz normale Vererbung einsetzen. c) Komplizierter wird es, wenn eine Klasse Amphibious für Amphibienfahrzeuge sowohl fahren als auch schwimmen können soll. Implementierungen kann man in Java aber nur einfach erben (im Gegensatz zu Schnittstellen). Glücklicherweise kann man per Delegation Mehrfachvererbung simulieren. Setzen Sie also Delegation ein, um Amphibious zu implementieren. d) Stellen Sie sicher, dass Ihre Klassen Car und Amphibious wie folgt verwendet werden können: VehicleTest.java public class VehicleTest { public static void testabilities(vehicle vehicle) { System.out.println("----> Object: "+vehicle); if (vehicle instanceof Driving) { System.out.println("Can drive:"); ((Driving)vehicle).drive(); if (vehicle instanceof Swimming) { System.out.println("Can swim:"); ((Swimming)vehicle).swim(); public static void main(string[] args) { testabilities(new Car()); testabilities(new Amphibious()); Die main-methode soll dabei folgende Ausgabe erzeugen: ----> Object: Car Can drive: drive ----> Object: Amphibious Can drive: drive Can swim: swim

SwimmingImpl.java public class SwimmingImpl implements Swimming { public void swim() { System.out.println("swim"); DrivingImpl.java public class DrivingImpl implements Driving { public void drive() { System.out.println("drive"); Car.java public class Car extends DrivingImpl { public String tostring() { return "Car"; Amphibious.java public class Amphibious implements Driving, Swimming { private Driving driving = new DrivingImpl(); private Swimming swimming = new SwimmingImpl(); public void drive() { driving.drive(); public void swim() { swimming.swim(); public String tostring() { return "Amphibious"; Abgabe: Per UniWorx, bis spätestens Montag, den 3.7.2006 um 9:00 Uhr.