Modellierung und Programmierung 1

Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut f¨ ur Informatik Universit¨ at Leipzig 14. Januar 201...
Author: Herbert Frank
23 downloads 1 Views 543KB Size
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”