4 Folien/Blatt - Arbeitsgruppe Theoretische Informatik und IT ...
4 Folien/Blatt - Arbeitsgruppe Theoretische Informatik und IT ...
4 Folien/Blatt - Arbeitsgruppe Theoretische Informatik und IT ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
✬<br />
Wiederholung: Objekte in Java<br />
• werden in Klassen zusammengefasst<br />
→ class Person<br />
• besitzen Eigenschaften <strong>und</strong> Verhalten<br />
→ Attribute <strong>und</strong> Methoden<br />
• verbergen private Informationen<br />
→ public, protected, private<br />
• werden geboren, leben <strong>und</strong> sterben<br />
→ Konstruktoren, Objektreferenzen,<br />
Finalizer<br />
• sind u.U. Spezialfälle allgemeinerer Objekte<br />
→ Angestellter extends Person<br />
• kommunizieren über definierte<br />
Schnittstellen<br />
→ Interface Comparator<br />
heute: Beziehung zu anderen Objekten<br />
✫<br />
✬<br />
• Aggregation<br />
Objekte enthalten andere Objekte<br />
(Gesamtheit-Teil-Beziehung):<br />
✫<br />
Klausur<br />
1<br />
0..m<br />
0..n<br />
Aufgabe<br />
Spezialfall: Komposition<br />
Teilobjekte in genau einer Gesamtheit,<br />
können ohne die Gesamtheit nicht<br />
(sinnvoll) existieren:<br />
Tastatur<br />
1..n<br />
Taste<br />
Beobachtung: Grenze zwischen<br />
Assoziation <strong>und</strong> Aggregation oft fließend.<br />
• Generalisierung/Spezialisierung<br />
Objekte sind Spezialfälle anderer Objekte:<br />
Fahrzeug Auto<br />
3<br />
✩<br />
✪<br />
✩<br />
✪<br />
✬<br />
4 Implementation von<br />
✫<br />
Objektbeziehungen mit<br />
dem Java Collections<br />
Framework<br />
4.1 Objektbeziehungen<br />
• Assoziation<br />
Strukturelle Beziehung zwischen<br />
gleichberechtigten Objekten, Objekte<br />
” kennen“ sich:<br />
✬<br />
Angestellter<br />
0..m<br />
2<br />
0..n<br />
Computer<br />
Wie implementiert man Objektbeziehungen in<br />
Java?<br />
explizite Unterstützung für einfache<br />
Generalisierung/ Spezialisierung:<br />
• class Auto extends Fahrzeug<br />
• interface Paketschalter extends<br />
Postschalter<br />
komplizierter:<br />
• multiple Vererbung<br />
• Assoziationen/Aggregationen<br />
• Multiplizitäten<br />
✫<br />
– 0..1: Objektreferenzen<br />
– 0..n: ” Objektsammlungen“<br />
→ Java Collections Framework<br />
4<br />
✩<br />
✪<br />
✩<br />
✪
✬<br />
4.2 Java Collections Framework<br />
Collection = Objekt, das eine Gruppe von<br />
Objekten repräsentiert<br />
Basisoperationen:<br />
• contains(o) - Ist o in der Collection?<br />
• size() - Anzahl der Elemente in der<br />
Collection<br />
• iterator() - Iterator über die Elemente<br />
der Collection<br />
Weitere Operationen wie add, remove sind<br />
optional, d.h. werden nicht von allen<br />
implementierenden Klassen bereitgestellt.<br />
→ Aufruf von nicht unterstützten Operationen<br />
führt zu UnsupportedOperationExceptions.<br />
Iterator = Guided Tour durch die Collection,<br />
besucht die Elemente der Collection der Reihe<br />
nach<br />
✫<br />
✬<br />
Map = Objekt, das Schlüssel-Wert-Paare<br />
verwaltet<br />
Beispiel: Matrikelnummer-Student-Paare<br />
(0812155, Michael), (0812177, Marcus)<br />
Beachte: Nur höchstens ein Wert pro Schlüssel<br />
Basisoperationen:<br />
5<br />
• get(key) - Wert, der dem key zugeordnet<br />
ist<br />
• containsKey(key) - Enthält die Map einen<br />
Wert für key?<br />
weitere Operationen wie put(key,value),<br />
remove(key) optional wie bei Collections.<br />
Spezielle Maps:<br />
• geordnete Map (SortedMap)<br />
Einträge nach Schlüsseln geordnet<br />
• MultiMap (vgl. Übungsblatt 13)<br />
mehr als ein Wert pro Schlüssel<br />
✫<br />
7<br />
✩<br />
✪<br />
✩<br />
✪<br />
✬<br />
Spezielle Collections:<br />
• Menge (Set)<br />
Jedes Element höchstens einmal enthalten,<br />
Ordnung irrelevant,<br />
d.h. {1, 1, 2} = {1, 2} = {2, 1}.<br />
• geordnete Menge (SortedSet)<br />
Ordnung wichtig, d.h. {1, 2} �= {2, 1}.<br />
• Liste (List)<br />
Duplikate zugelassen, Ordnung wichtig,<br />
d.h. (1, 1, 2) �= (1, 2) �= (2, 1).<br />
• Warteschlange (Queue)<br />
Duplikate zugelassen, Ordnung<br />
normalerweise FIFO, oder speziell definiert<br />
(z.B. bei PriorityQueues).<br />
✫<br />
✬<br />
✫<br />
<br />
Set<br />
<br />
SortedSet<br />
6<br />
<br />
Collection<br />
<br />
List<br />
HashSet TreeSet LinkedList<br />
<br />
Map<br />
<br />
SortedMap<br />
HashMap TreeMap<br />
8<br />
<br />
Queue<br />
✩<br />
✪<br />
✩<br />
✪
✬<br />
Wie definiert man die Gleichheit <strong>und</strong> die<br />
Ordnung von Elementen?<br />
→ Gleichheitstest mit der Methode equals,<br />
definiert in der Klasse Object<br />
→ Vergleich mit der Methode compareTo aus<br />
dem Interface Comparable<br />
Definitionen:<br />
• Objects o1 <strong>und</strong> o2 sind genau dann<br />
gleich, wenn o1.equals(o2)<br />
• Das Objekt o1 ist genau dann<br />
✫<br />
– kleiner als o2, wenn<br />
o1.compareTo(o2)0<br />
Standardimplementation in Object:<br />
o1.equals(o2)==true ⇔ o1==o2<br />
✬<br />
Zusätzlich sollten x.equals(y) bzw.<br />
x.compareTo(y) bei jedem Aufruf jeweils den<br />
gleichen Wert liefern, solange sich ihre<br />
Eingabedaten nicht ändern.<br />
Auch möglich:<br />
Vergleichsklasse definieren, die das<br />
Comparator-Interface mit der Methode<br />
compare(o1,o2) implementiert, <strong>und</strong> an die<br />
Konstruktoren geordneter Collections bzw.<br />
Maps übergeben.<br />
→ Semantik äquivalent zu o1.compareTo(o2)<br />
✫<br />
9<br />
11<br />
✩<br />
✪<br />
✩<br />
✪<br />
✬<br />
Um <strong>und</strong>efiniertes Verhalten zu vermeiden,<br />
sollte man bei eigenen Implementationen<br />
sicherstellen, dass für alle x,y,z�=null gilt<br />
• x.equals(null)==false<br />
• x.equals(x)==true (Reflexivität)<br />
• x.equals(y)==true ⇔<br />
y.equals(x)==true (Symmetrie)<br />
• x.equals(y)==true <strong>und</strong><br />
y.equals(z)==true ⇒<br />
x.equals(z)==true (Transitivität)<br />
<strong>und</strong> analog<br />
• x.compareTo(null) erzeugt eine<br />
NullPointerException<br />
• x.compareTo(x)==0<br />
• x.comapreTo(y)==0 ⇔<br />
x.equals(y)==true<br />
• x.compareTo(y)≤0 ⇔ y.compareTo(x)≥0<br />
• x.compareTo(y)≤0 <strong>und</strong><br />
y.compareTo(z)≤0 ⇒ x.compareTo(z)≤0<br />
✫<br />
✬<br />
4.3 Generics im Collections<br />
Framework<br />
10<br />
Pre-JDK 1.5 Definitionen:<br />
Beispiel:<br />
✫<br />
<br />
Collection<br />
+contains(o:Object): boolean<br />
+size(): int<br />
+iterator(): Iterator<br />
<br />
Iterator<br />
+hasNext(): boolean<br />
+next(): Object<br />
+remove()<br />
Collection namen = new HashSet();<br />
namen.add(new String("Max"));<br />
namen.add(new String("Moritz"));<br />
namen.add(new Integer(2));<br />
Iterator it = namen.iterator();<br />
while (it.hasNext()){<br />
String name = (String)it.next();<br />
System.out.println(name);<br />
}<br />
12<br />
✩<br />
✪<br />
✩<br />
✪
✬<br />
→ ClassCastException beim Auslesen der 2,<br />
wird bei der Übersetzung nicht entdeckt<br />
Beobachtung: Je mehr Fehler schon bei der<br />
Übersetzung des Programms gef<strong>und</strong>en werden<br />
können, desto besser.<br />
→ Mit Hilfe von Generics können wir dem<br />
Compiler ab JDK 1.5 bei der Fehlersuche<br />
helfen, indem wir ihm explizit sagen, welchen<br />
Datentyp wir in der Collection namen<br />
speichern wollen.<br />
Definitionen im JDK 1.5:<br />
✫<br />
✬<br />
<br />
Collection<br />
+contains(o:Object): boolean<br />
+size(): int<br />
+iterator(): Iterator<br />
13<br />
<br />
Iterator<br />
+hasNext(): boolean<br />
+next(): T<br />
+remove()<br />
4.4 Implementation von<br />
Assoziationen/Aggregationen<br />
4.4.1 0..1 - 0..1<br />
Beispiel: Student-ecUM<br />
class Student{<br />
private EcUM ecUM;<br />
// ...<br />
public void setEcUM(EcUM ecUM){<br />
this.ecUM = ecUM;<br />
if (ecUM != null) ecUM.setBesitzer(this);<br />
}<br />
public getEcUM() { return ecUM; }<br />
}<br />
class EcUM{<br />
private Student besitzer;<br />
// ...<br />
public void setBesitzer(Student s){<br />
besitzer=s;<br />
if (s != null) s.setEcUM(this);<br />
}<br />
public getBesitzer() { return besitzer; }<br />
}<br />
✫<br />
15<br />
✩<br />
✪<br />
✩<br />
✪<br />
✬<br />
Neue Version des Beispiels:<br />
Collection namen<br />
= new HashSet();<br />
namen.add(new String("Max"));<br />
namen.add(new String("Moritz"));<br />
namen.add(new Integer(2));<br />
// Fehler bei der Uebersetzung<br />
Iterator it = namen.iterator();<br />
while (it.hasNext()){<br />
String name = it.next();<br />
// kein Typecast mehr notwendig<br />
System.out.println(name);<br />
}<br />
Auslesen der Elemente per For-Each-Loop:<br />
for (String name : namen){<br />
System.out.println(name);<br />
}<br />
✫<br />
✬<br />
4.4.2 0..1 - 0..n<br />
Beispiel: Mutter-Kind<br />
public class Mutter{<br />
Set kinder;<br />
// ...<br />
public Mutter(){<br />
kinder = new HashSet();<br />
}<br />
public void addKind(Kind k){<br />
if (k!=null){<br />
kinder.add(k);<br />
k.setMutter(this);<br />
}<br />
}<br />
}<br />
public class Kind{<br />
Mutter mutter;<br />
// ...<br />
public void setMutter(Mutter m){<br />
mutter = m;<br />
if (m!=null) m.addKind(this);<br />
}<br />
}<br />
✫<br />
14<br />
16<br />
✩<br />
✪<br />
✩<br />
✪
✬<br />
4.4.3 0..m - 0..n<br />
Beispiel: Student-Vorlesung<br />
Student <strong>und</strong> Vorlesung analog zu Mutter<br />
→ Übungsaufgabe<br />
Anmerkungen:<br />
• Komposition kann man in Java über innere<br />
Klassen, d.h. Klassen innerhalb von<br />
Klassen realisieren<br />
• Multiple Vererbung kann man in Java<br />
eingeschränkt emulieren durch Erben von<br />
einer Superklasse <strong>und</strong><br />
Kompositionsbeziehung mit der anderen<br />
Superklasse<br />
→ An dieser Stelle keine Details . . .<br />
✫<br />
✬<br />
17<br />
5 Die Klausur<br />
5.1 Aufbau <strong>und</strong> Ziele<br />
• voraussichtlich 27.03.2006, 10.00-11.06 Uhr<br />
• zugelassene Hilfsmittel: keine<br />
Aufgaben:<br />
1. Verständnisfragen<br />
kleine Codeschnipsel, argumentative<br />
Aufgaben (mit kurzen(!) Antworten)<br />
2. HTML/CSS<br />
vollständige elementare HTML-Seiten,<br />
Gr<strong>und</strong>lagen der CSS-Programmierung<br />
3. prozedurales Java<br />
vollständige Java-Application mit<br />
Gr<strong>und</strong>lagen der Sprache<br />
4. objektorientiertes Java<br />
Teilaufgaben zu Objektorientierung, GUI<br />
<strong>und</strong> Collections Framework<br />
5. wie 4.<br />
✫<br />
19<br />
✩<br />
✪<br />
✩<br />
✪<br />
✬<br />
4.5 Zusammenfassung<br />
Weitere Quellen zum Java Collections<br />
Framework:<br />
• PK1-Vorlesung am kommenden Montag<br />
• offizielle Dokumentation unter<br />
http://java.sun.com/j2se/1.5.0/docs/<br />
guide/collections/index.html<br />
• Vorlesung Algorithmen <strong>und</strong><br />
Datenstrukturen<br />
→ Algorithmen in den<br />
Collection-Implementationen<br />
Praktische Anwendungen:<br />
• Übungsblatt 13<br />
• Programmiermethodik<br />
• (vorgeschriebenes) Praktikum<br />
• echtes Programmiererleben<br />
✫<br />
✬<br />
Beachte: HTML-Teil allein reicht nicht zum<br />
Bestehen.<br />
18<br />
Ziel: Gr<strong>und</strong>legendes Verständnis prüfen, nicht<br />
Detail-Faktenwissen abfragen<br />
5.2 Vor der Klausur<br />
• gr<strong>und</strong>legende Programmierpraxis in<br />
HTML/CSS <strong>und</strong> Java erwerben<br />
→ Übungsaufgaben, alte Klausuren,<br />
Aufgaben in Büchern, selbstgestellte<br />
Aufgaben<br />
• Online-Dokumentationen durchblättern<br />
• theoretisches Sprachwissen über<br />
HTML/CSS <strong>und</strong> Java schichtenweise<br />
erwerben<br />
• Kommunikationskanäle nutzen<br />
(Diskussionsforum, Kommillitonen, Sprech<strong>und</strong><br />
Fragest<strong>und</strong>en)<br />
✫<br />
20<br />
✩<br />
✪<br />
✩<br />
✪
✬<br />
5.3 In der Klausur<br />
• Wo nichts steht, gibt’s keine Punkte!<br />
• Zeit ist tendenziell knapp<br />
✫<br />
→ leserliche Schrift reicht, wir erwarten<br />
keine Schönschrift ;-)<br />
→ möglichst viele einfach zu holende<br />
Punkte mitnehmen<br />
→ nicht an Details festbeissen<br />
5.4 Nach der Klausur<br />
• Ruhe bewahren (Noten oft besser als<br />
erwartet)<br />
• Klausureinsicht nutzen<br />
→ Punktzahl <strong>und</strong> Note verifizieren<br />
→ Fehler der Korrektoren finden<br />
→ aus eigenen Fehlern lernen<br />
• Nachklausur wird im Herbst angeboten<br />
21<br />
✩<br />
✪