IT I: Heute • Interfaces • Interfaces List, Set und Collection • HashCode • HashSet • Projekt Scheduling 22.11.2016 IT I - VO 7 1 Organisatorisches • Tutorium bis Semesterende montags und mittwochs • UE am Tag des Zwischentests? (UE entfällt in der Woche davor) 22.11.2016 IT I - VO 7 2 Wissensüberprüfung • Ein mehrfacher Methodenaufruf obj1.tuWas(obj2) muss nicht immer denselben Rückgabewert haben! • Selbst wenn der Rückgabewert derselbe ist, ändern die zugrundeliegenden Objekte u.U. durch den Mehrfachaufruf ihre Attribute! 22.11.2016 IT I - VO 7 3 Wissensüberprüfung • Überschreiben von Methoden: Aufruf der Methode der Oberklasse ist oft nötig, damit überschriebene Methode was macht. 22.11.2016 IT I - VO 7 4 Abstrakte Methoden und Klassen • Eine abstrakte Methode ist die Definition einer Methode ohne Implementierung: abstract String getDetails(); • Eine Klasse mit einer abstrakten Methode muss selbst abstrakt sein: abstract class Disk { … } • Von einer abstrakten Klasse können keine Objekte erzeugt werden (da u.U. manche Methoden nicht implementiert sind). • In einer nicht-abstrakten Unterklasse einer abstrakten Klasse muss es für alle abstrakten Methoden Implementierungen geben. 22.11.2016 IT I - VO 7 5 Java interfaces • Interfaces sind eine besondere Form von abstrakten Klassen: – Alle Methoden sind public und abstract. – Es gibt keine Konstruktoren. – Es gibt keine Attribute außer Konstantendefinitionen, die public, static und final sind. • D.h., dass eine nicht-abstrakte Unterklasse eines Interfaces alle Methoden des Interfaces implementieren muss. • Insofern ist ein Interface eine Spezifikation, die angibt, über welche Methoden eine Objekt dieses Typs verfügt. 22.11.2016 IT I - VO 7 6 Syntax von Java interfaces (1) • interface Interfacename { … } • class Klassenname implements Interfacename { … } 22.11.2016 IT I - VO 7 7 ArrayList implementiert Interface List 22.11.2016 IT I - VO 7 8 List • Gegeben: List<Anlage> liste; • kann alle Methoden aus dem Interface List verwenden: - get(i) - for each – Schleife - size() - etc. 22.11.2016 IT I - VO 7 9 List • Rückgabewert List<Anlage>: muss Objekt einer Klasse zurückgeben, das List implementiert, z.B. ArrayList • List<Anlage> liste = new ArrayList<Anlage>(); oder • ArrayList<Anlage> liste = new ArrayList<Anlage>(); 22.11.2016 IT I - VO 7 10 Interfaces • Interfaces können ganz normal als Datentyp eingesetzt werden, s. Bspe. mit Interface List ! • Weiteres Beispiel: interface einInterface { public boolean istDoof(); } einInterface x = ...; if(x.istDoof()){...} • NB: Konkrete Objekte (z.B. rechte Seite der Zuweisung x=...;) sind immer von einer Klasse, die das Interface implementiert! 22.11.2016 IT I - VO 7 11 Mehrfachvererbung 22.11.2016 IT I - VO 7 12 Mehrfachvererbung • Wenn eine Klasse von mehreren Oberklassen erbt, kann es zu Konflikten kommen, wenn dieselbe Methode in mehreren Oberklassen unterschiedlich implementiert ist. – Welche Methode wird ausgeführt? • In Java wird dieser Konflikt vermieden, indem es nur eine echte Oberklasse geben kann, alle anderen Oberklassen müssen Interfaces sein. • Da es in Interfaces keine Implementierung gibt, kommt es zu keinen Konflikten. 22.11.2016 IT I - VO 7 13 Syntax von Java interfaces (2) • interface Interfacename implements Interface1, …, InterfaceK { … } • class Klassenname extends Oberklasse implements Interface1, …, InterfaceK { … } 22.11.2016 IT I - VO 7 14 Collections (1) • • • • • Hold groups of objects. Increase their capacity as necessary. Keep the objects in (some) order. Details of how all this is done are hidden. We specify: – the type of a collection: e.g. ArrayList – the type of the objects it will contain: e.g. <String> • Collections are defined in java.util. 22.11.2016 IT I - VO 7 15 Collections (2) • Die Gemeinsamkeiten von Collections sind im Interface Collection definiert. • Wichtige Sub-Interfaces von Collection sind List und Set. • Konkrete (nicht-abstrakte) Unterklassen von List sind ArrayList und LinkedList, sowie HashSet und TreeSet von Set. • Die wesentlichen Methoden für eine Liste sind im Interface List definiert, und daher für ArrayList und LinkedList gleich. 22.11.2016 IT I - VO 7 16 Sets • Sets sind Collections: – add() – size() – for each Schleife Achtung: Für Set gibt's keine get-Methode! (Zugriff nur über for each Schleife!) 22.11.2016 IT I - VO 7 17 Sets • Unterschiede zwischen List und Set: – List enthält eine Sequenz von Objekten. – Objekte können öfters vorkommen. – Set enthält Objekte in keiner bestimmten Reihenfolge (keine get-Methode!) Spez. Implementierungen existieren, die eine spezielle Reihenfolge der Objekte einhalten. – In Set kommt ein Objekt nur einmal vor. 22.11.2016 IT I - VO 7 18 HashSet • Benötigt eine korrekte Implementierung der Methode public int hashCode() in java.lang.Object. • Die Methode hashCode() gibt im wesentlichen an, wo ein Objekt in einem HashSet gespeichert wird. 22.11.2016 IT I - VO 7 19 hashCode() Um sicherzustellen, dass gleiche Objekte korrekt aufgefunden werden, müssen zwei gleiche Objekte, d.h. x.equals(y) == true, auch den gleichen Hashcode haben, x.hashCode() == y.hashCode(). (Die Umkehrung muss/kann i.a. nicht gelten!!!) 22.11.2016 IT I - VO 7 20 hashCode() • Auch für andere Bibliotheksklassen muss hashCode() korrekt implementiert sein. • Überschreiben von equals() erfordert das Überschreiben von hashCode()! • Eine neue hashCode()-Methode verwendet in der Regel die Attribute, die von equals() verwendet werden. – z.B.: Kombination der Hashcodes der Attribute mit XOR(^): a1.hashCode() ^ a2.hashCode() ^ a3.hashCode() für Attribute a1, a2, a3. 22.11.2016 IT I - VO 7 21 hashCode() Vereinfachte Illustration für interne Verwendung des Hashcodes: • Speichere Objekte einer Klasse in einem Array auf dem Index, der dem Hashcode entspricht. • Auf diese Weise hat man schnellen Zugriff auf Objekt (weil über Hashcode direkt zugreifbar). • Probleme gibt’s, wenn zwei verschiedene Objekte denselben Hashcode haben. 22.11.2016 IT I - VO 7 22 public boolean equals(Object obj) • equals() sollte die folgenden Eigenschaften haben: – obj.equals(obj) == true – obj1.equals(obj2) == obj2.equals(obj1) – Wenn obj1.equals(obj2)==true und obj2.equals(obj3)==true dann auch obj1.equals(obj3)==true. – Das Ergebnis von obj1.equals(obj2) sollte sich nicht verändern, wenn obj1 und obj2 unverändert bleiben. – obj.equals(null) == false 15.11.2016 IT I - VO 6 23 Überschreiben von equals() • equals(Object obj) ist für beliebige Objekte als Argumente definiert. • In einer überschreibenden equals()-Methode ist in der Regel ein Überprüfen der Klasse von obj und ein Casting notwendig. • obj instanceof eineKlasse – Liefert true, wenn obj ein Objekt von eineKlasse ist. 22.11.2016 IT I - VO 7 24