Technische Universität Darmstadt Telecooperation/RBG Grundlagen der Informatik 1 Thema 15: Klasseneigenschaften, Zugriffsrechte und Collections Dr. Guido Rößling Copyrighted material; for TUD student use only Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Inhaltsverzeichnis • Klasseneigenschaften • Zugriffsrechte • Collections (Wrapper und Collection-Typen) Grundlagen der Informatik I: T15 2 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften • Manche Eigenschaften sollten von allen Instanzen einer Klasse geteilt werden: – Zähler, wie viele Instanzen einer Klasse erzeugt wurden. – Eindeutige Versionsnummer der Klasse – Konstanten, notwendig für alle Objekte • Klassenvariablen und Klassenmethoden sind Merkmale, die mit der Klasse selbst (und nicht den Objekten) verbunden sind. Grundlagen der Informatik I: T15 3 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften • Klasseneigenschaften werden mit dem Schlüsselwort static definiert • Zugriff mit <Class>.<Identifier> – In der Klasse kann man den Klassennamen weg lassen • Es kann von überall darauf zugegriffen werden, wo die Klasse sichtbar ist. • Bekannte Beispiele – Klassenattribut: System.out – Klassenmethode: public static void main(...) Grundlagen der Informatik I: T15 4 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften class Person { static int personCount = 0; static Variable existiert einmal für alle Objekte Initialisierung erfolgt vor dem Ausführen einer Methode Person( .. ) { personCount++; // ... } // ... Bei der Erzeugung einer neuen Person wird der Zähler aktualisiert Grundlagen der Informatik I: T15 5 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften // class Person (fortgesetzt) // ... static int personCount() { return personCount; } // ... Abfrage der Anzahl der existierenden Personen Grundlagen der Informatik I: T15 6 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften • Zugriff über den Klassennamen int count = Person.personCount(); System.out.println(count +" objects"); • Andere typische Nutzung Empfänger wird mit einem anderen Objekt verglichen boolean largerThan(Circle b ) {.. } static boolean largerThan(Circle a, Circle b) {..} Vergleicht zwei Circle-Objekte Grundlagen der Informatik I: T15 7 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften Klassenmethoden können nicht auf Instanz-Merkmale zugreifen. class Mistake { int i; public static void main(String[] args) { something(i); } } // ... Nur möglich, wenn ein Objekt erzeugt wurde oder „i“ eine Klassenvariable ist. Grundlagen der Informatik I: T15 8 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften Statische Intialisierung <Static-Initializer> ::= static { <Statements> } • Ziel: Initialisierung von Klassenattributen • Analog zu Konstruktoren für Objekte • Sinnvoll, wenn eine einfache Initialisierung nicht ausreicht Grundlagen der Informatik I: T15 9 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasseneigenschaften Statische Initialisierung public class InitializationExample { private static double[] vector = new double[6]; // static initialization block static { for (int i = 0; i < vector.length; i++) { vector[i] = 1.0/(i + 1); } } // ... } Ausführung beim Laden der Klassendefinition Grundlagen der Informatik I: T15 10 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Konstanten • Können nur einmal einen Wert zugewiesen bekommen – Danach nur Lesezugriff à unveränderlich • Konstanten werden wie Variablen deklariert, aber es wird das Schlüsselwort final verwendet – private final int MAXIMUM_NUMBER_CARDS = 5; – Eine Konstante muss immer initialisiert werden – Konvention: mit Großbuchstaben benennen (mehrere Wörter mit Unterstrichen trennen) Grundlagen der Informatik I: T15 11 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Inhaltsverzeichnis • Klasseneigenschaften • Zugriffsrechte • Collection (Wrapper und Collection-Typen) Grundlagen der Informatik I: T15 12 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte • Elemente einer Klasse werden mit ihrer Sichtbarkeit deklariert – <Modifier> ::= private | ε | protected | public – Mit Hilfe des Sichtbarkeits-Modifier wird festgelegt, welche Kunden welche Attribute / Methoden / Klassen nutzen dürfen. • Vier Ebenen der Sichtbarkeit – Versteckte Elemente – Package-Elemente – Interne Elemente – Elemente mit freiem Zugriff (private) (kein Modifier) (protected) (public) Grundlagen der Informatik I: T15 13 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte private • Zugriff nur aus der Klasse selbst erlaubt package (implizit; kein Modifier angegeben) • Das Klassenelement ist sichtbar für alle Klassen im gleichen Package • Kein Zugriff aus anderen Packages zulässig – Nicht einmal von Erben aus anderen Packages! à Package als Sammlung von Klassen, die einander „vertrauen“, haben einen hohen Zusammenhalt Grundlagen der Informatik I: T15 14 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte protected • Alle Klassen des gleichen Packages dürfen auf das Element zugreifen, allerdings auch alle Erben dieser Klassen (auch aus einem anderen Package) à Erben als „vertrauenswürdige“ Kunden haben das Recht, die Implementierung der Superklasse zu sehen. public • Jede Klasse darf auf das Element zugreifen Grundlagen der Informatik I: T15 15 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte Überblick private package protected public Gleiche Klasse Erben im gleichen Package gleiches Package Erben in anderen Packages in anderen Packages Haben die gleichen Zugriffsrechte Grundlagen der Informatik I: T15 16 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte package A; public class AA { public int protected int void private void } one; two; three() { … } four() { … } package A; class AB { // one, two, three } package A; class AC extends AA { // one, two, three } package B; class BA extends AA { // one, two } package B; class BB { // one } Grundlagen der Informatik I: T15 17 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte Klassen-Modifier • Entweder public – Weltweite Einzigartigkeit – Nur eine Klasse pro Datei kann public sein – Datei muss den Namen „Klassenname.java“ haben • oder implizit – Nur sichtbar im gleichen Package Grundlagen der Informatik I: T15 18 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte Modifier und Redefinition • Wenn eine Methode erneut definiert wird, kann die Sichtbarkeit nur erweitert werden. • Grund: Substituierbarkeit – Es muss möglich sein, ein Objekt eines spezifischeren Typs mit einem generelleren Objekt zu ersetzen. – Die Subklasse muss wenigstens so viele Merkmale anbieten wie die Superklasse. à Sie darf keine erneut definierten Merkmale vor Klienten verstecken Grundlagen der Informatik I: T15 19 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Zugriffsrechte Sichtbarkeit in UML • public • protected • private • Kein Modifier ð ð ð ð + # Sichtbarkeit ist undefiniert Class -privateAttribute : AnotherClass #protectedAttribute : int +publicMethod(x: int) : boolean Grundlagen der Informatik I: T15 20 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Inhaltsverzeichnis • Klasseneigenschaften • Zugriffsrechte • Collection (Wrapper und Collection-Typen) Grundlagen der Informatik I: T15 21 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collection Typen • Eine häufig benötigte Form von Datenstrukturen ist eine Collection (Sammlung), die unterschiedliche Datenelemente speichert. – entweder genau der gleiche Typ – oder der gleiche Typ (mit Subtypen) – oder gemischte Typen • Abhängig vom geplanten Gebrauch kann eine Collection… – – – – – Schnellen Zugriff auf die einzelnen Elemente unterstützen. Die Sortierung der Elemente unterstützen. Die Möglichkeit zum Zugriff auf bestimmte Elemente geben. Bei Bedarf wachsen. usw. Grundlagen der Informatik I: T15 22 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Wrapper-Klassen Werte und Referenzen • Primitive Datentypen sind keine Referenztypen à Sie werden nicht von Object abgeleitet und besitzen keine Methoden. à Sie können Variablen vom Typ Object nicht zugewiesen werden. • Manchmal ist es sinnvoll (z.B. für Collections), primitive Datentypen so zu behandeln, als wären sie Objekte à Wrapper-Klassen Grundlagen der Informatik I: T15 23 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Wrapper-Klassen • Der Name der Klasse ist vom primitiven Datentyp abgeleitet, Großbuchstabe am Anfang – java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character • Wrapper-Objekte sind unveränderlich – Wertzuweisung über den Konstruktor oder valueOf(...) – Wertabfrage über die Methode <primitiveType>Value() Grundlagen der Informatik I: T15 24 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Autoboxing - Autounboxing • Seit Java 5+ gibt es eine implizite Umwandlung von int nach Integer (andere Typen analog) // AUTOBOXING Integer integer = 5; Integer integer = Integer.valueOf(5); // AUTO-UNBOXING int i = integer; int i = integer.intValue(); Grundlagen der Informatik I: T15 25 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections Java bietet eine Menge unterschiedlicher Collections (Sammlungen) an. Diese implementieren das java.util.Collection Interface, oder eines der folgenden Subinterfaces (nicht vollständig!): • Collection • • – Ein allgemeines Interface für das Sammeln von Objekten – Keine Restriktionen / Garantien bezüglich Duplikate / Ordnung / Sortierung, usw. List (hat die Implementierungen ArrayList, LinkedList,Vector,…) – Objekte sind sortiert – Kann Duplikate enthalten Collection – Direkter Zugriff auf Objekte über Index Set (hat die Implementierung HashSet) – Objekt kann nur einmal enthalten sein List Set • SortedSet (hat die Implementierung TreeSet) – Ein Set, aber geordnet. Nutzer kann eine spezifische Vergleichsstrategie festlegen Grundlagen der Informatik I: T15 SortedSet 26 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Listen • Im folgenden wird von Collections vom Typ „E“ (für Element) ausgegangen; dieser Typ ist durch „passende“ Typen ersetzbar. – Details folgen im Foliensatz T18 zu Generischen Datentypen • Das Interface java.util.List bietet folgende Methoden: – boolean add(E e) • Anhängen des Elements e an die Liste – void add(int pos, E e) • Einfügen des Elements e an Position pos; verschiebt alle Elemente ab Position pos um eine Position nach hinten – boolean addAll(Collection c) • Anhängen aller Elemente der Collection c an die Liste – boolean addAll(int pos, Collection c) • Einfügen aller Elemente der Collection c an Position pos (s.o.) Grundlagen der Informatik I: T15 27 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Listen • void clear() – Löscht alle Elemente der Liste • boolean contains(Object o) – Liefert true, wenn sich Objekt o in der Liste befindet • boolean containsAll(Collection c) – Liefert true, wenn alle Objekte der Collection c in der Liste sind • E get(int pos) – Liefert das Element an Position pos der Liste • int indexOf(Object o) – Liefert die erste Position, an der sich o in der Liste befindet, sonst -1. Gegenstück: int lastIndexOf(Object o) • boolean isEmpty() – Liefert true wenn die Liste leer ist Grundlagen der Informatik I: T15 28 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Listen • E remove(int pos) – Entfernt das Objekt an Position pos und liefert es zurück • boolean remove(Object O) – Versucht Objekt o aus der Liste zu entfernen; true bei Erfolg • int size() – Liefert die Größe der Liste • Object[] toArray() – Liefert ein Array, das alle Elemente der Liste umfasst • Konstruktoren in den Erbenklassen: – Parameterlos – Mit Collection als Parameter – kopiert alle Werte in die Liste – Spezialfälle (siehe bei Untertyp) Grundlagen der Informatik I: T15 29 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Implementierungen von List • java.util.LinkedList – Fügt folgende Methoden hinzu (Auswahl): • • • • void addFirst(E) void addLast(E) E getFirst() E getLast() • java.util.ArrayList – Elemente werden in einem Array gespeichert – Neue Methoden (Auswahl): • void ensureCapacity(int minCapacity) – falls die Liste weniger Elemente als minCapacity fassen kann, wird das Array vergrößert • void trimToSize() – verkleinert das Array auf die Listengröße – Neuer Konstruktor: ArrayList(int initialCapacity) Grundlagen der Informatik I: T15 30 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Implementierung von List • java.util.Vector: – Prinzipiell identisch zu java.util.ArrayList (à – Zugriffe erfolgen synchronisiert arraybasiert) • Vermeidet Probleme, wenn zwei Objekte gleichzeitig schreibend oder schreibend/lesend zugreifen wollen – „Standardklasse“ für viele Anwendungen – Konstruktoren: • Vector() – legt einen Vector mit vordefinierter Größe an • Vector(int c) – legt Vector mit Größe c an • Vector(int c, int inc) – legt Vector mit Größe c an; wenn diese nicht langt, werden immer „inc“ Elemente hinzugenommen • Der letzte Konstruktor ist zu bevorzugen – Man sollte vorher bestimmen, mit wie vielen Daten man rechnet! Grundlagen der Informatik I: T15 31 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Set • Ein Set repräsentiert eine mathematische Menge – Daher ist ein gegebenes Objekt nur maximal einmal vorhanden • Umfasst die meisten der schon bekannten Methoden – – – – – – – – – – boolean add(E e) boolean addAll(Collection c) void clear() boolean contains(Object O) boolean containsAll(Collection c) boolean isEmpty() boolean remove(Object O) boolean removeAll(Collection c) int size() Object[] toArray() • Einfügen scheitert, wenn das Objekt schon vorhanden ist Grundlagen der Informatik I: T15 32 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collections: Set • Konkrete Instanzen von Set: – java.util.HashSet: verwaltet die Daten in einer Hashtabelle (sehr effizienter Zugriff) – java.util.TreeSet: verwaltet die Daten in einem Baum mit Zugriffszeiten in O(log n). • Es gibt weitere spezialisierte Implementierungen – Bitte schauen Sie selbst in die JDK API Documentation! Grundlagen der Informatik I: T15 33 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Interface: Map • Manchmal sollen Objekte nicht über einen numerischen Index, sondern über einen Schlüssel (einzigartiger, aber sonst zufälliger Wert) auffindbar sein, z.B. eine Telefonnummer mit „Nachname + Vorname“ • Unterstützt durch das Interface java.util.Map • … und der abgeleiteten Schnittstelle SortedMap Map SortedMap Grundlagen der Informatik I: T15 34 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasse: java.util.HashMap • Implementiert das Interface java.util.Map. • Erlaubt Zugriff auf Elemente durch einen berechneten Schlüssel, z.B. „Nachname + Vorname“ • Schlüssel wird in numerischen Index (Hashwert) konvertiert und für effizienten Zugriff genutzt – Sehr effizienter Zugriff – Hashing-Theorie im nächsten Semester • Nützliche Konstruktoren – HashMap() Standard-Konstruktor – HashMap(int size) legt eine neue HashMap der Größe size an – HashMap(Map t) legt eine HashMap an, die alle Elemente der Map t enthält Grundlagen der Informatik I: T15 35 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Klasse: java.util.HashMap • Nützliche Methoden… – Object put(Object key, Object value) speichert "value" zum Auffinden mit "key" – Object get(Object key) findet das Objekt gespeichert unter "key" – boolean containsKey(Object key) beantwortet, ob ein Objekt unter "key" liegt – boolean containsValue(Object value) beantwortet, ob "value" in der HashMap ist – Object remove(Object key) löscht "key" und die assoziierten Objekte Grundlagen der Informatik I: T15 36 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Iteratoren • Java nutzt einen Iterator, um über Elemente in einer Collection zu laufen („zu iterieren“) • Normalerweise erhält man den Iterator durch den Aufruf von iterator() auf der Collection – Das gilt für alle Subklassen des Collection Interface – Für eine HashMap nutzt man keySet() und darauf iterator() • iterator() liefert eine Instanz von java.util.Iterator Grundlagen der Informatik I: T15 37 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Iteratoren Ein Iterator bietet nur drei Operationen: • boolean hasNext() – gibt es noch weitere Elemente? • Object next() – liefert das nächste Element, falls eines existiert – Sonst wird eine NoSuchElementException geworfen (siehe T16) – Prüfen Sie vorher die Existenz mit hasNext()! • void remove() – entfernt das zuletzt gelieferte Element – Wird nicht von allen Typen unterstützt – In dem Fall wird eine UnsupportedOperationException ausgelöst Grundlagen der Informatik I: T15 38 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Iteratoren • Ein Einsatz von Iteratoren sieht wie folgt aus: List intList = Arrays.asList(1, 2, 3); // Liste anlegen int s = 0; for (Iterator it = intList.iterator(); // Iterator holen it.hasNext(); ) // weiter, solange Elemente da s += (Integer)it.next(); // Element zur Summe addieren • Dazu gibt es eine spezielle Variante der for-Schleife: for (Object o : intList) // Iterator holen // weiter, solange Element da s += (Integer)o; // Element zur Summe addieren • Diese Schleife nutzt den Iterator für next() – Der Wert wird dann in jeder Iteration an o zugewiesen • Nutzbar für iterierbare Elemente – Collections, Arrays Grundlagen der Informatik I: T15 39 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Collection Framework • Auf Grund des Umfangs dieses Themas und der kurzen Zeit haben wir die Collections kaum abgedeckt • Mehr über Collections unter http://java.sun.com/docs/books/tutorial/collections/index.html • Mehrere spezielle Klassen sind verfügbar • Bevor Sie selbst einen Typ implementieren, prüfen Sie http://java.sun.com/javase/6/docs/technotes/guides/collections/index.html Grundlagen der Informatik I: T15 40