Interfaces und Generics

Ähnliche Dokumente
1 Polymorphie (Vielgestaltigkeit)

Programmieren 2 Java Überblick

Softwaretechnik WS 16/17. Übungsblatt 01

1 Abstrakte Klassen, finale Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

ALP II Dynamische Datenmengen

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

OOP. Tagesprogramm. Generizität

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Javakurs für Anfänger

8. Generics Grundlagen der Programmierung 1 (Java)

Algorithmen und Datenstrukturen 07

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Kapitel 4: Klassen und Unterklassen

Programmieren I. Kapitel 8. Vererbung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

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

Programmierkurs Java

Info B VL 8: Abstrakte Klassen & Interfaces

Aufgabenblatt Nr. 5 Generizität und TicTacToe

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Kapitel 6. Vererbung

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Kapitel 6. Vererbung

Gebundene Typparameter

13. Tutorium zu Programmieren

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

Einstieg in die Informatik mit Java

Große Übung Praktische Informatik 1

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

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

Kapitel 6. Vererbung

Typumwandlungen bei Referenztypen

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Schnittstellen implementieren am Beispiel Suchbaum

Java I Vorlesung 6 Referenz-Datentypen

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

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

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Objektorientierte Programmierung

Theorie zu Übung 8 Implementierung in Java

Programmieren 2 Java Überblick

Java - Programmierung - Objektorientierte Programmierung 1

II.4.1 Unterklassen und Vererbung - 1 -

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Proseminar: C# und.net. 6. Vortag Generische Klassen. Sebastian Wolf

5. Abstrakte Klassen

Java I Vorlesung Vererbung und Sichtbarkeit

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Probeklausur: Programmierung WS04/05

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

6. Globalübung (zu Übungsblatt 8)

Programmieren in Java

Javakurs zu Informatik I. Henning Heitkötter

Vererbung und Polymorphie

Einstieg in die Informatik mit Java

Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

Informatik II (D-ITET) Übungsstunde 6

Java-Schulung Grundlagen

Javakurs für Anfänger

1. Abstrakte Klassen

Übungsblatt 7. Thema: Sortieren, Objektorientierung

Javakurs für Anfänger

Teil V. Generics und Kollektionen in Java

Institut fu r Informatik

3 Objektorientierte Konzepte in Java

Java für Computerlinguisten

OOP. Tagesprogramm. Dynamische Typinformation. Homogene Übersetzung der Generizität. Generizität und Typumwandlungen

Algorithmen und Datenstrukturen II

Prinzipien Objektorientierter Programmierung

Programmierkurs C++ Abstrakte Klassen und Methoden

Objektorientierte Programmierung

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Prof. Dr. Uwe Schmidt. 21.August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (BInf 211, BTInf 211, BMInf 211, BWInf 211)

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Klausur Grundlagen der Programmierung

Algorithmen und Programmierung II

Distributed Computing Group

Einstieg in die Informatik mit Java

Listing 1: Cowboy. Listing 2: Woody

Klassen mit Instanzmethoden

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Objektorientierte Programmierung

Einführung in die Programmierung für NF. Vererbung

Binärbäume. Prof. Dr. E. Ehses,

Probeklausur: Programmierung WS04/05

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

Java I Vorlesung Generics und Packages

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Transkript:

Algorithmen und Datenstrukturen Wintersemester 2012/13 21. Vorlesung Interfaces und Generics Jan-Henrik Haunert Lehrstuhl für Informatik I

Übersicht Liste und InsertionSort für Punkte für Objekte beliebiger Klassen für Objekte von Klassen, die ein(e) Nutzer(in) festlegen kann

Übersicht Liste und InsertionSort für Punkte (Wiederholung vom 15.11.2012) für Objekte beliebiger Klassen für Objekte von Klassen, die ein(e) Nutzer(in) festlegen kann

InsertionSort für Punkte Ein Punkt in der Ebene: public class Punkt { public double x; public double y; UML-Diagramm: +x:double +y:double Punkt Voraussetzung fürs Sortieren: Definition einer Ordnung y p 3 p i < p j genau dann, wenn p 1 p i.x < p j.x oder ( p i.x = p j.x und p i.y < p j.y) 1 p 2 p 4 0 0 1 x = lexikographische Ordnung

Ein Punkt in der Ebene: InsertionSort für Punkte public class Punkt { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(punkt p) { if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1; UML-Diagramm: +x:double +y:double Punkt +Punkt(double, double) +compareto(punkt):int

InsertionSort für Punkte public class Sortierverfahren { public static void insertionsort(int[] a) { for (int j = 1; j < a.length; j++) { int key = a[j]; int i = j - 1; while (i >= 0 && a[i] > key) { a[i + 1] = a[i]; i--; a[i + 1] = key;

InsertionSort für Punkte public class Sortierverfahren { public static void insertionsort(punkt[] a) { for (int j = 1; j < a.length; j++) { Punkt key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key;

InsertionSort für Punkte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); public static void insertionsort(punkt[] a) { //...

InsertionSort für Punkte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); Ausgabe: a[3] = new Punkt(4, 3); insertionsort(a); 1.0 1.0 for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); 1.0 2.0 3.0 1.0 public static void insertionsort(punkt[] a) { //... 4.0 3.0

InsertionSort für Punkte Problem: eigene Sortiermethode für jede Klasse notwendig public static void insertionsort(punkt[] a) { //...

Liste für Punkte x y head nil prev key next nil

Liste für Punkte x y head nil prev key next nil public class PunktListenElement { public Punkt key; public PunktListenElement prev; public PunktListenElement next; public PunktListenElement(Punkt k, PunktListenElement p) { key = k; next = p; prev = null;

Liste für Punkte public class PunktListe { public PunktListenElement head; public PunktListenElement insert(punkt k) { PunktListenElement x = new PunktListenElement(k, head); if (head!= null) { head.prev = x; head = x; return x; public class PunktListenElement { public Punkt key; public PunktListenElement prev; public PunktListenElement next; public PunktListenElement(Punkt k, PunktListenElement p) { key = k; next = p; prev = null;

Liste für Punkte public class PunktListenTest { public static void main(string[] args) { PunktListe l = new PunktListe(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (PunktListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y);

Liste für Punkte public class PunktListenTest { public static void main(string[] args) { PunktListe l = new PunktListe(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (PunktListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Ausgabe: 1.0 0.0 2.0 2.0 0.0 1.0

Liste für Punkte public class PunktListenTest { public static void main(string[] args) { PunktListe l = new PunktListe(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (PunktListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Problem: eigene Liste für jede Klasse notwendig

Liste für Punkte public class PunktListenTest { public static void main(string[] args) { PunktListe l = new PunktListe(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (PunktListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Problem: eigene Liste für jede Klasse notwendig Lösung: erstelle Liste für Objekte der Klasse java.lang.object

Liste für Objekte java.lang.object Punkt Jede Java-Klasse ist Unterklasse der Klasse java.lang.object Eine Liste, die Objekte vom Typ java.lang.object aufnehmen kann, kann also jedes Objekt aufnehmen.

Liste für Objekte public class PunktListe { public PunktListenElement head; public PunktListenElement insert(punkt k) { PunktListenElement x = new PunktListenElement(k, head); if (head!= null) { head.prev = x; head = x; return x; public class PunktListenElement { public Punkt key; public PunktListenElement prev; public PunktListenElement next; public PunktListenElement(Punkt k, PunktListenElement p) { key = k; next = p; prev = null;

Liste für Objekte public class Liste { public ListenElement head; public ListenElement insert(object k) { ListenElement x = new ListenElement(k, head); if (head!= null) { head.prev = x; head = x; return x; public class ListenElement { public Object key; public ListenElement prev; public ListenElement next; public ListenElement(Object k, ListenElement p) { key = k; next = p; prev = null;

Liste für Objekte public class PunktListenTest { public static void main(string[] args) { PunktListe l = new PunktListe(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (PunktListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListenElement p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Compiler: "p.key.x cannot be resolved or is not a field"

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListenElement p = l.head; p!= null; p = p.next) { Punkt mypunkt = (Punkt) p.key; //explizite Typkonvertierung System.out.println(myPunkt.x + " " + mypunkt.y); Ausgabe: 1.0 0.0 2.0 2.0 0.0 1.0

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); Wir können nun auch Objekte anderer Klassen in die Liste einfügen

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { Punkt mypunkt = (Punkt) p.key; //explizite Typkonvertierung System.out.println(myPunkt.x + " " + mypunkt.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { Punkt mypunkt = (Punkt) p.key; //explizite Typkonvertierung System.out.println(myPunkt.x + " " + mypunkt.y); Ausgabe: Exception in thread "main" java.lang.classcastexception: java.lang.integer cannot be cast to Punkt at ListenTest.main(ListenTest.java:12)

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { if (p.key instanceof Punkt) { Punkt mypunkt = (Punkt) p.key; System.out.println(myPunkt.x + " " + mypunkt.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { if (p.key instanceof Punkt) { Punkt mypunkt = (Punkt) p.key; System.out.println(myPunkt.x + " " + mypunkt.y); instanceof überprüft, ob Objekt zu Klasse gehört

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { if (p.key instanceof Punkt) { Punkt mypunkt = (Punkt) p.key; System.out.println(myPunkt.x + " " + mypunkt.y); Ausgabe: 1.0 0.0 2.0 2.0 0.0 1.0

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { if (p.key instanceof Punkt) { Punkt mypunkt = (Punkt) p.key; System.out.println(myPunkt.x + " " + mypunkt.y); Ausgabe: 1.0 0.0 2.0 2.0 0.0 1.0...es werden nur die Punkte ausgegeben

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { //gib Ergebnis von p.key.tostring() aus: System.out.println(p.key); Ausgabe: 4 3.2 Punkt@c3c749 Punkt@150bd4d Punkt@1bc4459

Liste für Objekte java.lang.object +tostring():string java.lang.double +tostring():string java.lang.integer +tostring():string Punkt for (ListenElement p = l.head; p!= null; p = p.next) { //gib Ergebnis von p.key.tostring() aus: System.out.println(p.key); Ausgabe: 4 tostring (Klasse Integer) 3.2 tostring (Klasse Double) Punkt@c3c749 tostring (Klasse Object) Punkt@150bd4d Punkt@1bc4459

Liste für Objekte java.lang.object +tostring():string java.lang.double +tostring():string java.lang.integer +tostring():string Punkt +tostring():string public class Punkt { public double x; public double y; public String tostring() { return "(" + x + ", " + y + ")"; //...

Liste für Objekte java.lang.object +tostring():string java.lang.double +tostring():string java.lang.integer +tostring():string Punkt +tostring():string public class Punkt { public double x; public double y; public String tostring() { return "(" + x + ", " + y + ")"; //... Methode tostring der Klasse Object wird überschrieben

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { //gib Ergebnis von p.key.tostring() aus: System.out.println(p.key); Ausgabe: 4 3.2 Punkt@c3c749 Punkt@150bd4d Punkt@1bc4459 java.lang.object +tostring():string Punkt

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(3.2)); l.insert(new Integer(4)); for (ListenElement p = l.head; p!= null; p = p.next) { //gib Ergebnis von p.key.tostring() aus: System.out.println(p.key); Ausgabe: 4 3.2 (1.0, 0.0) (2.0, 2.0) (0.0, 1.0) java.lang.object +tostring():string Punkt +tostring():string

InsertionSort für Punkte Problem: eigene Sortiermethode für jede Klasse notwendig public static void insertionsort(punkt[] a) { //...

InsertionSort für Objekte public class Sortierverfahren { public static void insertionsort(punkt[] a) { for (int j = 1; j < a.length; j++) { Punkt key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key;

InsertionSort für Objekte public class Sortierverfahren { public static void insertionsort(object[] a) { for (int j = 1; j < a.length; j++) { Object key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key;

InsertionSort für Objekte public class Sortierverfahren { public static void insertionsort(object[] a) { for (int j = 1; j < a.length; j++) { Object key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key; Compiler: "The method compareto(object) is undefined for the type Object"

InsertionSort für Objekte public class Sortierverfahren { public static void insertionsort(comparable[] a) { for (int j = 1; j < a.length; j++) { Comparable key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key;

InsertionSort für Objekte public class Sortierverfahren { public static void insertionsort(comparable[] a) { for (int j = 1; j < a.length; j++) { Comparable key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key; To Do: Definiere Klasse Comparable, so dass sichergestellt ist, dass Objekte von Unterklassen vergleichbar sind

InsertionSort für Objekte public class Comparable { public int compareto(object o) { //? To Do: Definiere Klasse Comparable, so dass sichergestellt ist, dass Objekte von Unterklassen vergleichbar sind

InsertionSort für Objekte public class Comparable { public int compareto(object o) { //? Es fällt uns schwer, eine allgemeine Definition zu finden.

InsertionSort für Objekte public class Comparable { public int compareto(object o) { //? Es fällt uns schwer, eine allgemeine Definition zu finden. Wir sollten daher verbieten, Instanzen unserer Klasse Comparable zu erzeugen.

InsertionSort für Objekte public abstract class Comparable { public abstract int compareto(object o); Es fällt uns schwer, eine allgemeine Definition zu finden. Wir sollten daher verbieten, Instanzen unserer Klasse Comparable zu erzeugen. Deshalb: abstract

InsertionSort für Objekte public abstract class Comparable { public abstract int compareto(object o); Die Klasse unserer Vergleichsobjekte hat evtl. bereits eine Oberklasse. Tier Elefant

InsertionSort für Objekte public abstract class Comparable { public abstract int compareto(object o); Die Klasse unserer Vergleichsobjekte hat evtl. bereits eine Oberklasse. Tier Comparable Elefant Mehrfachvererbung ist verboten!

InsertionSort für Objekte public interface Comparable { public int compareto(object o); Die Klasse unserer Vergleichsobjekte hat evtl. bereits eine Oberklasse. Deshalb: interface Tier <<Interface>> Comparable Elefant

InsertionSort für Objekte Interfaces ähneln abstrakten Klassen, die ausschließlich abstrakte Methoden besitzen (keine Attribute und keine implementierten Methoden). Unterschied: Eine Klasse kann mehrere Interfaces implementieren, aber nur eine Klasse (direkt) erweitern. Tier <<Interface>> Comparable Elefant

InsertionSort für Objekte public interface Comparable { public int compareto(object o); Interface Comparable war bis Java-Version 1.4 so im Paket java.lang definiert.

InsertionSort für Objekte public class Punkt { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(punkt p) { if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(punkt p) { Compiler: "The type Punkt must implement the inherited abstract method Comparable.compareTo(Object)" if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(object o) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); public static void insertionsort(comparable[] a) { //...

InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); Hier wird Feld mit Punkt-Objekten übergeben Hier wird Feld mit Comparable-Objekten entgegengenommen for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); public static void insertionsort(comparable[] a) { //...

InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); Ausgabe: 1.0 1.0 for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); 1.0 2.0 3.0 1.0 public static void insertionsort(comparable[] a) { //... 4.0 3.0

InsertionSort für Objekte +m:punkt GeoFigur +GeoFigur(Punkt) +getflaeche():double +compareto(geofigur):int -a:double Quadrat +Quadrat(Punkt, double) +getflaeche():double +seta(double) +geta():double -r:double Kreis +Kreis(Punkt, double) +getflaeche():double +setr(double) +getr():double

InsertionSort für Objekte <<Interface>> Comparable +compareto(object):int +m:punkt GeoFigur +GeoFigur(Punkt) +getflaeche():double +compareto(object):int -a:double Quadrat +Quadrat(Punkt, double) +getflaeche():double +seta(double) +geta():double -r:double Kreis +Kreis(Punkt, double) +getflaeche():double +setr(double) +getr():double

Klasse GeoFigur in Java: InsertionSort für Objekte public class GeoFigur { public Punkt m; public GeoFigur(Punkt mym) { m = mym; public double getflaeche() { return 0.0; public int compareto(geofigur key) { if (this.getflaeche() > key.getflaeche()) return 1; if (this.getflaeche() < key.getflaeche()) return -1; return 0;

Klasse GeoFigur in Java: InsertionSort für Objekte public class GeoFigur implements Comparable { public Punkt m; public GeoFigur(Punkt mym) { m = mym; public double getflaeche() { return 0.0; public int compareto(object o) { GeoFigur key = (GeoFigur) o; if (this.getflaeche() > key.getflaeche()) return 1; if (this.getflaeche() < key.getflaeche()) return -1; return 0;

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { GeoFigur[] a = new GeoFigur[4]; a[0] = new Quadrat(new Punkt(0.0, 0.0), 2.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].getClass().toString() + " " + a[i].getflaeche()); public static void insertionsort(geofigur[] a) { //...

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { GeoFigur[] a = new GeoFigur[4]; a[0] = new Quadrat(new Punkt(0.0, 0.0), 2.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].getClass().toString() + " " + a[i].getflaeche()); public static void insertionsort(comparable[] a) { //...

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { GeoFigur[] a = new GeoFigur[4]; a[0] = new Quadrat(new Punkt(0.0, 0.0), 2.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); Ausgabe: for (int i = 0; i < a.length; i++) System.out.println(a[i].getClass().toString() + " " + a[i].getflaeche()); public static void insertionsort(comparable[] a) { //... class Quadrat 4.0 class Kreis 12.566370614359172 class Quadrat 16.0 class Kreis 50.26548245743669

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { GeoFigur[] a = new GeoFigur[4]; a[0] = new Punkt(0.0, 0.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].getClass().toString() + " " + a[i].getflaeche()); public static void insertionsort(comparable[] a) { //...

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { GeoFigur[] a = new GeoFigur[4]; a[0] = new Punkt(0.0, 0.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); Compiler: Type mismatch: cannot convert from Punkt to GeoFigur for (int i = 0; i < a.length; i++) System.out.println(a[i].getClass().toString() + " " + a[i].getflaeche()); public static void insertionsort(comparable[] a) { //...

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Comparable[] a = new Comparable[4]; a[0] = new Punkt(0.0, 0.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i]); public static void insertionsort(comparable[] a) { //...

Sortieren: InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Ausgabe: Comparable[] a = new Comparable[4]; a[0] = new Punkt(0.0, 0.0); a[1] = new Quadrat(new Punkt(1.0, 2.0), 4.0); a[2] = new Kreis(new Punkt(2.0, 0.0), 2.0); a[3] = new Kreis(new Punkt(0.0, 1.0), 4.0); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i]); Exception in thread "main" java.lang.classcastexception: Quadrat cannot be cast to Punkt public static void insertionsort(comparable[] a) { at Punkt.compareTo(Punkt.java:12) //... at Sortierverfahren.insertionSort(Sortierverfahren.java:21) at Sortierverfahren.main(Sortierverfahren.java:9)

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(object o) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; Ausgabe: if (this.x == p.x) { if (this.y < p.y) return -1; Exception if (this.y in thread == p.y) "main" return java.lang.classcastexception: 0; Quadrat cannot be cast to Punkt at Punkt.compareTo(Punkt.java:12) return 1; at Sortierverfahren.insertionSort(Sortierverfahren.java:21) at Sortierverfahren.main(Sortierverfahren.java:9)

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; /* gibt Wert < 0 fuer (this < p), Wert > 0 fuer (this > p) und 0 fuer (this = p) zurueck */ public int compareto(object o) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; public int compareto(object o) { if (o instanceof Punkt) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1; else { //?

InsertionSort für Objekte public class Punkt implements Comparable { public double x; public double y; public Punkt(double myx, double myy) { x = myx; y = myy; public int compareto(object o) { if (o instanceof Punkt) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1; else { //? Es wäre gut, wenn wir wüssten, mit was für Objekten wir zu rechnen haben.

InsertionSort für Objekte public interface Comparable { public int compareto(object o);

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); Seit Java Version 5 können generische Datentypen definiert werden.

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); Seit Java Version 5 können generische Datentypen definiert werden. Typparameter (Platzhalter für den Namen einer Klasse)

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); public class Punkt implements Comparable { //... public int compareto(object o) { Punkt p = (Punkt) o; if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); public class Punkt implements Comparable<Punkt> { //... public int compareto(punkt p) { if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); Für Typparameter wird Typargument (Punkt) eingesetzt. public class Punkt implements Comparable<Punkt> { //... public int compareto(punkt p) { if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1;

InsertionSort für Objekte public interface Comparable<T> { public int compareto(t o); Für Typparameter wird Typargument (Punkt) eingesetzt. public class Punkt implements Comparable<Punkt> { //... public int compareto(punkt p) { if (this.x < p.x) return -1; if (this.x == p.x) { if (this.y < p.y) return -1; if (this.y == p.y) return 0; return 1; Punkte können nur mit Punkten verglichen werden!

InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); public static void insertionsort(comparable[] a) { //...

InsertionSort für Objekte public class Sortierverfahren { public static void main(string[] args) { Punkt[] a = new Punkt[4]; a[0] = new Punkt(1, 2); a[1] = new Punkt(1, 1); a[2] = new Punkt(3, 1); a[3] = new Punkt(4, 3); insertionsort(a); for (int i = 0; i < a.length; i++) System.out.println(a[i].x + " " + a[i].y); public static <T extends Comparable<T>> void insertionsort (T[] a) { //...

InsertionSort für Objekte generische Methode: public static <T extends Comparable<T>> void insertionsort (T[] a) { //...

InsertionSort für Objekte generische Methode: Nimmt Feld mit Objekten einer Klasse T entgegen public static <T extends Comparable<T>> void insertionsort (T[] a) { //...

InsertionSort für Objekte generische Methode: Nimmt Feld mit Objekten einer Klasse T entgegen wobei T für beliebige Klasse steht, die diese Bedingung erfüllt public static <T extends Comparable<T>> void insertionsort (T[] a) { //...

InsertionSort für Objekte public class Sortierverfahren { public static <T extends Comparable<T>> void insertionsort(t[] a) { for (int j = 1; j < a.length; j++) { T key = a[j]; int i = j - 1; while (i >= 0 && a[i].compareto(key) > 0) { a[i + 1] = a[i]; i--; a[i + 1] = key;

Liste für Objekte public class Liste { public ListenElement head; public ListenElement insert(object k) { ListenElement x = new ListenElement(k, head); if (head!= null) { head.prev = x; head = x; return x; public class ListenElement { public Object key; public ListenElement prev; public ListenElement next; public ListenElement(Object k, ListenElement p) { key = k; next = p; prev = null;

Liste für Objekte public class List<T> { public ListItem<T> head; public ListItem<T> insert(t k) { ListItem<T> x = new ListItem<T>(k, head); if (head!= null) { head.prev = x; head = x; return x; public class ListItem<T> { public T key; public ListItem<T> prev; public ListItem<T> next; public ListItem (T k, ListItem<T> p) { key = k; next = p; prev = null;

Liste für Objekte public class ListenTest { public static void main(string[] args) { Liste l = new Liste(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListenElement p = l.head; p!= null; p = p.next) { if (p.key instanceof Punkt) { Punkt mypunkt = (Punkt) p.key; System.out.println(myPunkt.x + " " + mypunkt.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Punkt> l = new List<Punkt>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListItem<Punkt> p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Punkt> l = new List<Punkt>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); for (ListItem<Punkt> p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Ausgabe: 1.0 0.0 2.0 2.0 0.0 1.0

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Punkt> l = new List<Punkt>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(2.0)); for (ListItem<Punkt> p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y);

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Punkt> l = new List<Punkt>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(2.0)); for (ListItem<Punkt> p = l.head; p!= null; p = p.next) { System.out.println(p.key.x + " " + p.key.y); Compiler: "The method insert(punkt) in the type List<Punkt> is not applicable for the arguments (Double)"

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Object> l = new List<Object>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(2.0)); for (ListItem<Object> p = l.head; p!= null; p = p.next) { System.out.println(p.key);

Liste für Objekte public class ListenTest { public static void main(string[] args) { List<Object> l = new List<Object>(); l.insert(new Punkt(0.0, 1.0)); l.insert(new Punkt(2.0, 2.0)); l.insert(new Punkt(1.0, 0.0)); l.insert(new Double(2.0)); for (ListItem<Object> p = l.head; p!= null; p = p.next) { System.out.println(p.key); Ausgabe: 2.0 (1.0, 0.0) (2.0, 2.0) (0.0, 1.0)

Schluss Generische Datentypen/Methoden erlauben es, Datenstrukturen/Algorithmen so zu implementieren, dass sie für verschiedene Datentypen angewandt werden können.