IT I - VO 5

Werbung
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
Herunterladen