Java I Vorlesung Collections

Ähnliche Dokumente
Java I Vorlesung 6 Referenz-Datentypen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Programmierkurs Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Java I Vorlesung Generics und Packages

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Objektorientierte Programmierung. Kapitel 14: Interfaces

ALP II Dynamische Datenmengen

Einstieg in die Informatik mit Java

II.4.4 Exceptions - 1 -

Programmierkurs Java

Einstieg in die Informatik mit Java

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Fragen zur OOP in Java

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Java I Vorlesung Vererbung und Sichtbarkeit

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

12 Collections Framework. Interfaces Maps and Collections. Collection Interface. Überblick. Collection = Containterklasse, die andere Objekte enthält.

Tag 4 Repetitorium Informatik (Java)

Programmierkurs Java

II.4.5 Generische Datentypen - 1 -

Programmieren in Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Java Einführung Collections

Info B VL 8: Abstrakte Klassen & Interfaces

Programmiermethodik 3. Klausur Lösung

1 Klassen und Objekte

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

3 Objektorientierte Konzepte in Java

Vererbung, Polymorphie

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Vererbung und Polymorphie

4. Vererbung Die Klasse Object. Die Klasse Object

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Arrays. Einleitung. Deklarieren einer Array Variablen

Info B VL 14: Java Collections/Reflections

3. Übungsbesprechung Programmkonstruktion

ADT: Java Collections und ArrayList

12 Abstrakte Klassen, finale Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Programmieren 1 09 Vererbung und Polymorphie

Programmieren in Java -Eingangstest-

JAVA KURS COLLECTION

Grundlagen der Objektorientierten Programmierung - Statische Arrays

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Repetitorium Informatik (Java)

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Vorlesung Programmieren

Tag 4 Repetitorium Informatik (Java)

ADT: Verkettete Listen

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Kapitel 4: Klassen und Unterklassen

Kapitel 5: Interfaces

Abstrakte Datentypen und Java

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Algorithmen und Programmierung II

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Neuere Sprachelemente in Java

Einführung in die Programmierung

Teil V. Generics und Kollektionen in Java

Javakurs für Anfänger

Einfache Datentypen in JAVA

Interfaces und Generics

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

C++ - Objektorientierte Programmierung Vererbung

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

ALP II Dynamische Datenmengen Datenabstraktion

Programmieren 2 16 Java Collections und Generizität

Einführung in C# Teil 3. Matthias Nübling

Programmierkurs Java

Polymorphismus 179. Function.h. #include <string>

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

Einführung in die Programmierung für NF MI. Übung 04

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Tag 8 Repetitorium Informatik (Java)

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

8. Generics Grundlagen der Programmierung 1 (Java)

Vererbung. Was versteht man unter dem Begriff Vererbung?

Präsentation Interfaces

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Enhanced Collection API

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung mit C++ SS 2007

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Einführung Klassendefinitionen

Transkript:

Java I Vorlesung 5 Collections 24.5.2004 Abstrakte Klassen und Interfaces Arrays Java Collections Framework Abstrakte Klassen: Motivation Häufig will man eine Klasse schreiben, die nur als Basisklasse für andere Klassen dienen soll. Manche Methoden haben dort nur Dummy- Implementierungen und sind nur dazu da, dass ihre Existenz garantiert ist. Objekte der Basisklasse sollen nicht erzeugt werden. Lösung: Abstrakte Methoden in abstrakten Klassen. 2

Abstrakte Klassen: Motivation class IntList { public int first() { return -1; // Fehlerwert public IntList rest() { return null; // Fehlerwert public int size() { return -1; // Fehlerwert 3 Abstrakte Klassen: Motivation abstract class IntList { abstract public int first(); abstract public IntList rest(); abstract public int size(); class IntCons extends IntList { private int firstelement; public int first() { return firstelement; public IntList rest() {... public int size() {... 4

Abstrakte Methoden Eine abstrakte Methode ist eine Methode, die keine Implementierung hat. Zweck: Überschreiben in abgeleiteter Klasse Compiler garantiert, dass die Methode existiert. Deklaration mit dem Schlüsselwort abstract. Abstrakte Methoden dürfen nicht static sein. 5 Abstrakte Klassen Eine abstrakte Klasse ist eine Klasse, die eine abstrakte Methode deklariert. Deklaration mit Schlüsselwort abstract. Von einer abstrakten Klasse A können keine Objekte erzeugt werden: Ausdruck new A() ist syntaktisch falsch. Es kann aber Variablen von Typ A geben. 6

Abstrakte Klassen und Vererbung Von A abgeleitete Klasse B erbt alle abstrakten Methoden und darf sie überschreiben. Wenn nicht alle Methoden durch nicht-abstrakte Methoden überschrieben sind, muss auch B als abstract deklariert werden. Wenn B alle abstrakten Methoden mit nichtabstrakten Methoden überschreibt, darf B als nicht-abstrakt deklariert werden. Objekte von konkreter Klasse B dürfen Variablen von Typ A zugewiesen werden. 7 Abstrakte Klassen und Ableitung abstract class IntList { abstract public int first(); abstract public IntList rest(); abstract public int size(); class IntCons extends IntList { public int first() {... public IntList rest() {... public int size() {...... IntList fehler = new IntList(); // Fehler! IntList list = new IntCons(1, new IntNil()); 8

Abstrakte Klassen und Ableitung abstract class IntList { abstract public int first(); abstract public IntList rest(); abstract public int size(); class IntList2 extends IntList { public int size() {... 9 Abstrakte Klassen und Ableitung abstract class IntList { abstract public int first(); abstract public IntList rest(); abstract public int size(); abstract class IntList2 extends IntList { public int size() {... 10

Zweck von abstrakten Klassen Abstrakte Basisklasse kann Implementierungsdetails offen lassen. Abstrakte Methoden können in anderen Methoden verwendet werden. In jedem Objekt ist die abstrakte Methode dann garantiert überschrieben ("Template-Pattern"). 11 Abstrakte Klasse mit nicht-abstrakten Methoden abstract class GeoFigur { abstract public void draw(); abstract public int inhalt(); public void test() { draw(); System.out.println("Inhalt = " + inhalt()); 12

Interfaces Ein Interface spezifiziert Methoden, die von einer Klasse definiert werden müssen, kann aber gar keine Implementierung enthalten. Eine (abstrakte oder konkrete) Klasse kann ein Interface implementieren. 13 Interfaces als Datentypen Interfaces sind Referenz-Datentypen. Implementierende Klassen sind speziellere Typen als die Interfaces, d.h. Upcast ist möglich. Eine Klasse implementiert ein Interface nur dann, wenn sie ausdrücklich so deklariert ist -- selbst wenn sie alle Methoden implementiert. 14

IntList als Interface interface IntList { int first(); IntList rest(); int size(); class IntCons implements IntList { public int first() {... public IntList rest() {... public int size() {...... IntList fehler = new IntList(); // Fehler! IntList list = new IntCons(1, new IntNil()); 15 IntList als Interface interface IntList { int first(); IntList rest(); int size(); class IntCons { public int first() {... public IntList rest() {... public int size() {...... IntList list = new IntCons(1, new IntNil()); // Fehler: IntCons nicht "implements IntList"! 16

Members von Interfaces Alle Methodendeklarationen in Interfaces sind implizit public und abstract. Alle Felddeklarationen in Interfaces sind implizit public und static (und final, d.h. ihr Wert darf nicht verändert werden). Wenn implementierende Klasse nicht alle Methoden definiert, muss sie als abstract deklariert sein. 17 Zweck von Interfaces Vollständiges Verbergen von Implementierungsdetails nach außen. Methoden können Interfaces als Parameter nehmen, wenn sie nur wissen müssen, dass bestimmte Methoden definiert werden (egal wie). 18

Interfaces: Mehrfachvererbung Eine Klasse darf in Java nur von einer einzigen anderen Klasse abgeleitet sein. Eine Klasse darf aber beliebig viele Interfaces implementieren. Sie ist dann Untertyp jedes dieser Interfaces. Manchmal wird das ausgenutzt, um leere Interfaces als Markierung zu verwenden (z.b. Serializable in Java-API). 19 Interfaces vs. abstrakte Klassen Interfaces sind Extremfall auf Abstraktionsskala: In etwa eine Klasse ohne Felder und nur mit abstrakten Methoden. Wenn Klasse irgendwelche Implementierung (konkrete Methoden, Felder) enthalten soll, muss es eine abstrakte Klasse sein. Ansonsten ist oft Interface sinnvoll (Mehrfachvererbung!). Entscheidung zwischen Interface und abstrakter Klasse nicht immer einfach. 20

Arrays Ein Array ist eine Sammlung von Variablen des gleichen Datentyps, die zur Laufzeit erzeugt werden. Jedes Array hat einen eindeutigen Datentyp: A[] ist Typ "Array mit Einträgen von Typ A". Jedes Array hat eine eindeutige, unveränderliche Länge. A A A A A A A A A A A A... Länge 21 Arrays Zugriff auf Elemente mit eckigen Klammern: expr[i]. expr ist ein Ausdruck von Array-Typ; i ist ein Ausdruck von Typ int. Indices laufen ab 0. Zugriff auf zu große oder kleine Indices gibt einen Laufzeit-Fehler. 22

Arrays class ArrayTest { int[] array = new int[3]; array[0] = 3; array[1] = -54; array[2] = 100; for( int i = 0; i < 3; i++ ) System.out.println(array[i]); a[1] a[0] a[2] 3-54 100 23 Arrays: Mögliche Fehler class ArrayTest { int[] array = new int[3]; array[-1] = 0; // Index < 0 array[3] = 0; // Index > Array-Länge array[1] = "hallo"; // Falscher Datentyp a[1] a[0] a[2] 3-54 100 24

Arrays als Parameter von Methoden class Test { for( int i = 0; i < args.length; i++ ) System.out.println(args[i]); 25 Arrays deklarieren Ein Array wird genauso deklariert wie jede andere Variable auch: A[] varname; Dabei wird aber nur das Array-Objekt angelegt und noch kein Speicher für die Elemente des Arrays. 26

Arrays erzeugen Die Elemente des Arrays werden mit besonderer Form von new erzeugt: new A[expr]; expr muss ein Ausdruck von Typ int sein, der Länge des Arrays angibt. int[] array = new int[3]; a[1] a[0] a[2] 0 0 0 27 Arrays erzeugen: Initialisierer Arrays können bequem mit Initialisierern erzeugt werden: A[] varname = { x, y, z ; x, y, z sind Ausdrücke von Typ A. Länge des neuen Arrays ist Länge der Liste in Klammern. Achtung: {... ist kein eigener Ausdruck, sondern nur im Kontext der Variablen- Initialisierung zulässig! Kombination mit new ist erlaubt. 28

Initialisierer class ArrayTest { int[] array = {3, -54, 100; for( int i = 0; i < 3; i++ ) System.out.println(array[i]); 3-54 100 29 Initialisierer class ArrayTest { int[] array = new int[] {3, -54, 100; for( int i = 0; i < 3; i++ ) System.out.println(array[i]); 3-54 100 30

Initialisierer class ArrayTest { int[] array = new int[3] {3, -54, 100; for( int i = 0; i < 3; i++ ) System.out.println(array[i]); 3-54 100 31 Initialisierer class ArrayTest { int[] array; array = {3, -54, 100; // FEHLER! for( int i = 0; i < 3; i++ ) System.out.println(array[i]); 32

Länge von Arrays Jedes Array hat eine feste Länge. Die Länge eines Arrays kann mit dem Feld length ermittelt werden: expr.length Das ist v.a. nützlich, wenn man Array als Parameter in einer Methode übergeben bekommt. 33 Länge von Arrays class Test { for( int i = 0; i < args.length; i++ ) System.out.println(args[i]); 34

Mehrdimensionale Arrays Der Element-Datentyp eines Arrays darf seinerseits ein Array-Datentyp sein. Deren Element-Typen dürfen ihrerseits Array- Typen sein, und so weiter. Damit können mehrdimensionale Informationen gespeichert werden. Die verschiedenen Elemente des Arrays dürfen Arrays verschiedener Länge sein. 35 Matrizen class Matrix { int[][] matrix; matrix = new int[2][]; for( int i = 0; i < 5; i++ ) matrix[i] = new int[3]; matrix[0][1] = 17; matrix[0] matrix[1] 36

Matrizen class Matrix { int[][] matrix; matrix = new int[2][]; for( int i = 0; i < 5; i++ ) matrix[i] = new int[3]; matrix[0][1] = 17; matrix[0] 0 17 0 matrix[1] 37 Matrizen class Matrix { int[][] matrix; matrix = new int[2][]; for( int i = 0; i < 5; i++ ) matrix[i] = new int[3]; matrix[0][1] = 17; matrix[0] 0 17 0 matrix[1] 0 0 0 38

Länge muss nicht einheitlich sein class Matrix2 { int[][] matrix; matrix = new int[2][]; matrix[0] = new int[3]; matrix[1] = new int[4]; matrix[0][1] = 17; matrix[0] 0 17 0 matrix[1] 0 0 0 0 39 Mehrdimensionale Arrays: Erzeugen Das erste new A[expr][] legt nur in der ersten Dimension Speicher an. Jedem einzelnen Eintrag neues Array zuweisen: Schleife. Wenn alle Einträge gleiche Länge haben, abkürzende Schreibweise: new A[expr1][expr2] Mehrdimensionale Arrays können mit geschachtelten Initialisierern angelegt werden. 40

Matrizen class Matrix { int[][] matrix; matrix = new int[2][3]; matrix[0][1] = 17; matrix[0] 0 17 0 matrix[1] 0 0 0 41 Collections Manchmal weiß man zunächst noch nicht, wie viele Einträge ein Array haben soll. Das wird aber von Java nicht unterstützt: Länge des Arrays ist unveränderlich. Ausweg: Listen. Listen und andere Sammlungen (collections) von Objekten werden von Java Collections Framework bereitgestellt. 42

Java Collections Framework Definiert Interfaces für Datentypen, v.a. List<T>: Angeordnete Liste von Einträgen Set<T>: Ungeordnete Menge von Einträgen Map<S,T>: Abbildungen Verschiedene Implementierungen für jedes Interface. Java 1.5: Kann Typ S, T der Einträge angeben. http://java.sun.com/j2se/1.5.0/docs/guide/collections/ 43 Listen Eine Liste ist eine geordnete Abfolge von Werten. Gleicher Wert darf mehrfach vorkommen. Im JCF gibt es Interface List<T> für Listen mit Element-Typ T. T muss Referenz-Typ sein (nicht int o.ä.!). Wichtige Methoden: add: Element einfügen size: Länge der Liste get: Element an Position auslesen remove: Element entfernen 44

Listen import java.util.*; class Test { List<Integer> liste = new LinkedList<Integer>(); for( int i = 0; i < args.length; i++ ) liste.add(new Integer(args[i])); System.out.println("Elemente: " + liste.size()); System.out.println("1. Element: " + liste.get(0)); 45 Listen: Andere Implementierung import java.util.*; class Test { List<Integer> liste = new ArrayList<Integer>(); for( int i = 0; i < args.length; i++ ) liste.add(new Integer(args[i])); System.out.println("Elemente: " + liste.size()); System.out.println("1. Element: " + liste.get(0)); 46

Interfaces und Implementierungen Indem man im Programm nur die Interfaces verwendet, macht man sich von Implementierung unabhängig. Implementierungen von List<T> im JCF: ArrayList<T>: Liste intern mit Arrays implementiert LinkedList<T>: Als verkettete Liste implementiert Implementierungen haben Vor- und Nachteile. 47 Iteratoren Jedes JCF-Objekt kann einen Iterator zurückgeben, mit dem man mit for-schleife durch die Elemente des Objekts iterieren kann. Aufruf o.iterator() gibt ein Iterator<T>- Objekt zurück. Iteratoren haben Methoden hasnext(), next(). In Java 1.5 gibt es verkürzte Schreibweise für for-schleifen. 48

Iteratoren import java.util.*; class Test { List<Integer> liste = new ArrayList<Integer>(); //... for( Iterator<Integer> it = liste.iterator(); it.hasnext() ; ) { Integer x = it.next(); System.out.println(x); 49 Iteratoren: Verkürzte Syntax import java.util.*; class Test { List<Integer> liste = new ArrayList<Integer>(); //... for( Integer x : liste ) { System.out.println(x); 50

Mengen Eine Menge ist eine ungeordnete Sammlung von Werten. Jeder Wert kommt nur einmal vor. Interface Set<T> für Mengen mit Einträgen von Typ T. Wichtige Methoden: add, remove, size wie bei Listen get macht hier keinen Sinn! 51 Mengen Implementierungen: HashSet<T>: Über Hashtabellen implementiert; effizient TreeSet<T>: Menge nach Ordnung der Werte sortiert. LinkedHashSet<T>: Menge nach Ordnung der Einfüge-Operationen sortiert. 52

Mengen: Ein Beispiel import java.util.*; class Test { Set<Integer> s = new HashSet<Integer>(); s.add(new Integer(1)); s.add(new Integer(2)); s.add(new Integer(1)); System.out.println(s.size()); // -> 2 53 Abbildungen (Wörterbücher) Eine Abbildung bildet Werte eindeutig auf andere Werte ab. Interface Map<S,T> für Abbildungen von Typ S nach Typ T. Wichtigste Operationen: put(key, val): Legt Wert val unter Schlüssel key ab. containskey(key): Gibt es den Eintrag key? get(key): Liest Wert für Schlüssel key aus 54

Abbildungen (Wörterbücher) Implementierungen: HashMap<S,T>: Über Hashtabellen implementiert, effizient TreeMap<T>: Einträge nach Ordnung auf Schlüsseln sortiert. LinkedHashMap<T>: Einträge nach Ordnung der Einfüge-Operationen sortiert. 55 Abbildungen import java.util.*; class Test { Map<String,Integer> map = new HashMap<String,Integer>(); map.put("abcd", new Integer(3)); map.put("hallo", new Integer(-2)); for( String key : map.keyset() ) { System.out.println( key + " -> " + map.get(key) ); 56

Zusammenfassung Abstrakte Klassen und Interfaces erlauben die Definition von abstrakten Methoden ohne Implementierung. Arrays sind Sammlungen von gleichartigen Werten. Collections definieren Listen, Mengen und Abbildungen und nutzen konsequent Interfaces. 57

This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.