Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut f¨ ur Informatik Universit¨ at Leipzig
14. Januar 2016
Klassenhirarchie
Wiederholung: Super- und Subklassen I
Superklasse steht an der Spitze der Hierarchie
I
Subklassen sind von der Superklasse abgeleitet → Spezialisierung
I
die Subklasse exdends die Superklasse
I
die Subklasse erbt alle sichtbaren Instanzvariablen und -methoden von der Superklasse
I I
die Subklasse kann geerbte Methoden u ¨berschreiben und eigene Methoden hinzuf¨ ugen
I
die Subklasse muss eigene Konstruktoren haben
Abstrakte Klassen I
public abstract class [NameOfAbstractClass]
I
eine Klasse, die mindestens eine (evtl. geerbte) abstrakte Methode hat, ist abstrakt
I
sind nicht instanzierbar, k¨ onnen aber Konstruktoren haben
I
Variablen I Klassenvariablen und Konstanten – public static I Instanzvariablen k¨ onnen nur deklariert werden
I
Methoden I Klassenmethoden – public static I abstrakte Methoden sind immer Instanzmethoden und werden nur deklariert aber nicht definiert d.h. sie haben keinen Methodenrumpf I “normale” Instanzmethoden k¨ onnen definiert sein
I
abstrakte Klassen stehen an oberster Stelle in der Hierarchie
I
k¨onnen abstrakte Super- als auch Subklassen haben
I
public [NameOfSubclass] extends [NameOfAbstractClass]
Interface Ein Interface ist eine spezielle abstrakte Klassen. I public interface [NameOfInterface] I Interfaces m¨ ussen public sein I Interfaces haben kein Variablen nur Konstanten public static final [type] [CONSTANT] = [value]; I die Modifier “public static final” werden weggelassen [type] [CONSTANT] = [value]; I es gibt keine Klassenmethoden (static methods) I alles (Instanz-)Methoden sind public astract I die Modifier “public abstract” werden weggelassen I es gibt Super- und Subinterfaces I Klassen implementieren Interfaces [NameOfClass] implements [NameOfInterface] I Mehrfachvererbung ist erlaubt I d.h. eine Klasse kann mehrere Interfaces implementieren I Klassen, die das Interface implementieren m¨ ussen alle Methoden definieren oder sind abstrakte Methoden
Vergleich abstrakte Klasse vs. Interface
Beispiel: Umsonst ist der Tod Kunde {abstract}
Rechnung
bestellen();
bezahlen();
Freund
Privatkunde
Geschaftskunde
bezahlen();
bestellen(); bezahlen();
bestellen(); bezahlen();
ohne MwSt
< 5% Rabatt
~ 20% Rabatt
Warum Interfaces? Interfaces schreiben den implementierenden Klassen Methoden vor ¨ I Vorteil gegen¨ uber Vererben und Uberschreiben:
I
man kann nicht “darauf vergessen”, dass die Methode neu geschrieben werden muss → Vermeidung sematischer Fehler I
Mehrfachvererbung ist m¨ oglich
I
kann n¨ utzlich sein aber auch zu Konflikten f¨ uhren
Beispiel: TryConversion2 (Horton’s Beginning Java 7, Chapter 6)
Generische Klassen und Interfaces
I
werden auch als generische Typen, parametrisierte Typen bezeichnet
I
generische Klassen und Interfaces sind “Schablonen” (Templates)
I
sie haben einen (oder mehrere) Parameter
I
in anderne Worten: sind parametrisiert
I
diese Parameter sind Platzhalter f¨ ur Datentypen
I
Systax: class|interface Name
I
Systax: class|interface Name
Vorteil generischer Klassen Angenommen, wir h¨atten gerne eine Datenstruktur f¨ ur Paare von Objekten verschiedenen Typs... I
Herrchen – Hund
I
Herrchen – Frauchen
I
Herrchen – Aktionsradius
... so m¨ ussten wir ohne Generischen Type eine eigene Klasse f¨ ur jedes Paar von unterschiedlichen Typen schreiben. I
Pair(Herrchen, Hund)
I
Pair(Herrchen, Frauchen)
I
Pair(Herrchen, Aktionsradius)
Jetzt reicht eine generische Klasse f¨ ur alle erdenkbaren Paare von Typen I
public class Pair
Collections Eine Collection (deutsch: Sammlung) ist ein Objekt, das ein Set von Objekten bestimmten Types auf eine bestimmte Art organisiert. java.utils.Collections public class Collections extends Object I Set I
I
I
Sequence I
I
I
I
eine Menge von Objekten, in der jedes Objekt nur einmal vorkommt u.a. HashSet, TreeSet eine lineare Sequenz von Objekten, ¨ahnlich einem array aber ¨ dynamische Anderung der Gr¨ oße Lists: Vektor, ArrayList, LinkedList, Stack Queues: PriorityQueue
Map I
I
Eine Menge von Assotiationen eines Objektes des Typs V (V f¨ ur“value”) mit einem Objekt des Typs K (K f¨ ur “key”) HashMap
Vielverwendete Collection Datatyps in Bild ...
Vektor
Object Index [0]
[1]
[2]
[3]
[4]
Linked List
null
next
Stack
next
next
next
next
top
bottom
last−in first−out head
tail
Queue first−out
first−in
... und Wort I
Vector ist ¨ahnlich einem Array, w¨achst dynamisch wenn n¨otig langsames Einf¨ ugen und L¨ oschen, schneller sequenzieller und wahlweiser Zugriff synchroniziert (thread-safe)
I
ArrayList ist ¨ahnlich aber nicht synchroniziert LinkedList eine List bestehend aus Elementen jede Element besteht aus den Daten und einer Referenz auf das folgende Element das letzte Element zeigt auf null schnelles Einf¨ ugen und L¨ oschen, langsamer sequenzieller und wahlweiser Zugriff (kann auch als Stack oder Queue verwendet werden)
... und Wort I
Stack ist eine Liste mit einem “last-in first-out”-Mechanismus (LIFO) push – stellt Objekt an oberste Stelle der Liste pop – nimmt Objekt von oberster Stelle der Liste
I
Queue ist eine Liste mit einem “first-in first out”-Mechanismus (FIFO) offer – stellt Objekt an das Ende der Liste pop – nimmt Objekt von Beginn der Liste
I
HashMap speichter key/value-Paare (siehe sp¨ater)
I
HashSet eine (ungeordnente) Menge von Objekten die Implementation nutzt allerdings eine Hashmap um die Elemente zu finden die Reihenfolge, in der Elemente zur¨ uckgegeben werden, kann variieren
Klassenhierarchie der Collection-Klassen
Object
Abstract Classes Classes
AbstractSet
HashSet
TreeSet
AbstractCollection
AbstractList
ArrayList
Vektor
Stack
AbstractSequentialList
LinkedList
AbstractQueue
AbstractMap
PriorityQueue
HashMap
Klassenhierarchie der Collection-Interfaces Interfaces
Iterable
Collection
Set
List
Queue
Map
SortedSet
Die Interfaces legen fest, welche Methoden von den implemetierenden Klassen unabh¨angig zu implementieren/definieren sind. I
Interface Collection (siehe n¨achste Seite)
I
Interface Set f¨ ugt keine eigenen Methoden hinzu
I
Interface List z.B. get(int index), set(int index, E element), indexOf(Object o), lastIndexOf(Object o)
I
Interface Queue z.B. offer(E e), peek(), poll()
Interface Collection – Methoden
Collection-Klasse Vector I
extends AbstractList
I
u.a. implementierte Interfaces: iIterable, iCollection
I
implements List
I
constructor: Vector() initial capacity 10, capacity increment 0
I
constructor: Vector( int initialCapacity, int capacityIncrement)
I
Beispiel: Vector names = new Vector();
¨ Ubung: TrySimpleVector.java
Collection-Klasse Vector I
Kapazit¨ at: 10 (Inkrement 0)
I
dynamische Vergr¨ osserung: Verdoppelung der Kapazit¨at
I
Nachteil: Kapazit¨at oft viel Gr¨ oßer als n¨ otig → trimToSize() passt die Kapazit¨at an
I
Kapazit¨ at: 100 (Inkrement 10)
I
dynamische Vergr¨ osserung: Inkrementierung um 10
I
Nachteil: wiederholtes Allozieren von Speicher ist zeitaufw¨andig → think about your needs first
I
Einf¨ uge- und L¨ oschoperationen sind langsam weil der hintere Teil des Vektors umkopierte werden muss (um keine L¨ ucke zu lassen)
Iterator – u¨ber alle Elemente iterieren Hintergrund I
das Interface Iterable deklariert genau eine Methode:
I
iterator()
I
sie wird an die Subinterfaces Set, List und Queue etc. vererbt
I
und wird in allen Klassen, die eines dieser Interfaces implemetieren
I
(e.g. HashSet, TreeSet, ... Vektor, ... PriorityQueue)
I
spezifisch definiert
Verwendung I
iterator()
I
R¨ uchgabetyp: Iterator (ein Iterator-Objekt des Typs T) einen Interator kann u ¨ber alle Elemente des Typs T eines Sets iterieren
I
aber nur ein mal → one-time pass through
Drei Arten einen Vektor zu Durchlaufen I
klassischer Ansatz
I
Iterator verwenden
I
collection-base for loop
Welche Variante wird auch f¨ ur andere Collections funktionieren?
Interface Sets
M. Meiler
HasMap – von Schl¨usseln (keys) und Werten (values) I
Eine HashMap speichert key/value-Paare in einem Array.
I
Um direkt auf das Paar zugreifen zu k¨ onnen,
I
wird aus dem key-Objekt der Hashcode,
I
mit der Methode hashcode() der Klasse Objects, berechent.
I
Der Hashcode bestimmt die Position im Array,
I
an der das key/value-Paare abgelegt wird.
I
Durch Umwandlung des key in den hashcode kann auf die Speicherstelle (bucket) des Paars “direkt” zugegriffen werden.
I
zwei keys gleicher Hashcode → Kollision
I
HashMap speichert key/value-Paare mit dem gleichen Hashcode in einer linked list
I
Trade-Off: Zeit vs. Speicher Kollisionen vermeiden → großes Array, viele Speicher kleines Array → viele Kollisionen, erh¨ ohter Zeitaufwand
Collection-Klasse HasMap I
K – Datentyp/Klasse des key
I
V – Datentyp/Klasse des value
I
Konstruktor: HashMap()
I
Deklaration: HashMap starMap;
I
Definition: starMap = new HashMap();
I
Hinzuf¨ ugen von Elementen: put(K key, V value)
I
containsKey(Object K)
I
get(Object K) – R¨ uckgabewert V
I
keySet() – R¨ uckgabewert Set “returns a Set view of the keys contained in this map”
I
values() – R¨ uckgabewert Collection “returns a Collection view of the values contained in this map”