CS计算机代考程序代写 algorithm Java AI Programmierung
Programmierung
Interfaces in JAVA
Michael Goedicke
Auf der Basis von Folien von Volker Gruhn
Interfaces: Motivation
▪ In der Vorlesungseinheit über einfache Sortieralgorithmen / Listen – Bearbeitung haben wir das Problem betrachtet, Studierende anhand ihres Namens zu suchen oder zu sortieren.
public class Student { private String name; private String firstName; …
public int compareTo(Student other) { …
} }
▪ Da das Sortieren von Objekten in der Regel darauf basiert, dass Objekte paarweise verglichen werden, benötigen wir die Methode public int compareTo(Student other).
▪ Die für den Vergleich relevanten Attribute bezeichnen wir als Schlüssel, dabei kann eine beliebig große Menge aller Attribute gewählt werden
M. Goedicke – Programmierung WiSe 2020/2021 2
Interfaces: Motivation
▪ In der Vorlesungseinheit über Vererbung haben wir gesehen, dass wir Strukturen haben wollen, die unterschiedlich sind, jedoch gemeinsame Eigenschaften besitzen.
▪ Vgl Lego-Bausteine
▪ Es wird Information benötigt, wie die „Komponenten“ nach außen auftreten und was sie benötigen
Bilder aus Wikipedia http://de.wikipedia.org/wiki/Datei:Light_Green_Lego_Brick.jpg bzw http://de.wikipedia.org/wiki/Datei:Lego_dimensions.svg
M. Goedicke – Programmierung WiSe 2020/2021 3
Interfaces: Konzept
▪ Komponenten sind in Java hier Klassen und Methoden.
▪ Interfaces können für beide Bereiche angegeben und verwendet
werden
▪ Leider (noch) nicht so elegant wie bei Lego
▪ Es wird Information benötigt, wie die „Komponenten“ nach außen auftreten und was sie benötigen
In Java:
Deklarationen von Signaturen von Methoden Deklarationen von Konstanten
Das geht mit Abstrakten Klassen Interfaces
M. Goedicke – Programmierung WiSe 2020/2021 4
Interfaces: Beispiel
▪ Als Ordnungsrelation kann beispielsweise die lexikographische Ordnung gewählt werden, bzgl. der die Namen z. B. in Telefonbüchern sortiert sind.
▪ Für zwei Student-Instanzen a und b gilt dabei:
• a.compareTo(b) < 0, wenn a bzgl. der gewählten Ordnungsrelation
kleiner als b ist,
• a.compareTo(b) == 0, wenn a bzgl. der gewählten Ordnungsrelation
gleich b ist,
• a.compareTo(b) > 0, wenn a bzgl. der gewählten Ordnungsrelation
größer als b ist.
Vader, Andreas Vader, Barbara Vader, Darth Vollmann, Heike Vollrath, Hans
M. Goedicke – Programmierung WiSe 2020/2021 5
Interfaces: Beispiel
▪ Mit Hilfe der compareTo()-Methode kann man ein Student-Array sortieren:
public class BubbleSort {
public void sort(Student[] values) {
int high = values.length – 1;
for (int k = high; k > 0; k–) {
for (int i = 0; i < k; i++) {
if (values[i].compareTo(values[i + 1]) > 0) {
this.swap(values, i, i + 1); }
} }
}
… }
▪ Beobachtungen:
▪ Die Methode sort() ist durch den Parameter values vom Typ
Student[] stark an die Klasse Student gekoppelt.
▪ Die einzige Schnittstelle zwischen dem Algorithmus und der Klasse
Student ist die compareTo()-Methode.
M. Goedicke – Programmierung WiSe 2020/2021 6
Interfaces: Beispiel (abstrakte Klassen)
▪ Natürlich wollen wir nicht nur Studierende sortieren, sondern z. B. auch Autos.
▪ Um mit einer einzige Methode sowohl Student- als auch Car- Objekte zu sortieren, lagern wir die Spezifikation der Methode
compareTo() in eine abstrakte Klasse aus.
public void sort(Comparable[] values) { …
if (values[i].compareTo(values[i + 1]) > 0) { this.swap(values, i, i + 1);
}
… }
Comparable
+compareTo(other: Object): int
Student
Car
M. Goedicke – Programmierung WiSe 2020/2021 7
Interfaces: Erweiterung & Polymorphie
▪ Wiederholung: Wesentliche Bestandteile objektorientierter Programmiersprachen sind Erweiterung und Polymorphie.
▪ Wenn eine Klasse B von einer Klasse A erbt, dann besitzt jedes Objekt der Klasse B alle in Klasse A definierten Attribute, Assoziationen und Methoden.
▪ Jede Instanz der Klasse B ist vom Datentyp A, d. h. sie kann einer Variablen vom Typ A zugewiesen werden.
▪ Wir unterscheiden zwischen dem statischen Typ, der im Quelltext angegeben ist, und dem dynamischen Typ, welchen das Objekt tatsächlich zur Laufzeit hat.
▪ Vererbungsbeziehungen werden in JAVA über das Schlüsselwort extends angegeben.
public A { …
}
public class B extends A { …
}
A a = new A(); B b = new B(); a = b;
A
B
M. Goedicke – Programmierung WiSe 2020/2021 8
Interfaces: Erweiterung & Polymorphie
▪ In der Klasse B können die Methoden aus Klasse A überschrieben werden.
▪ Wenn in einer Erweiterungshierarchie durch Überschreiben mehrere Methoden mit gleicher Signatur auftreten, dann wird erst zur Laufzeit bestimmt, welche dieser Methoden auf ein gegebenes Objekt angewendet wird.
public String toString() {
return “Ich bin vom Typ A.”;
}
A a = new B(); System.out.println(a.toString()); // Ausgabe: Ich bin vom Typ B.
public String toString() {
return “Ich bin vom Typ B.”;
}
A
+toString():String
B
+toString():String
M. Goedicke – Programmierung WiSe 2020/2021 9
Interfaces: Erweiterung & Polymorphie
▪ Methoden können mit dem Schlüsselwort abstract markiert werden. In diesem Fall wird nur die Signatur, nicht aber die Implementierung der Methode angegeben.
▪ Klassen, die mindestens eine abstrakte Methode enthalten, sind ihrerseits abstrakt. Eine abstrakte Klasse kann nicht instanziiert werden.
▪ Wenn eine Klasse B von einer abstrakten Klasse A erbt und nicht selbst abstrakt ist, dann müssen alle abstrakten Methoden aus Klasse
A in Klasse B implementiert werden.
public abstract class Comparable { public abstract int
compareTo(Object other);
}
public class Student extends Comparable {
… }
public class Car extends Comparable { …
}
Comparable
+compareTo(other: Object): int
Student
Car
M. Goedicke – Programmierung WiSe 2020/2021 10
Interfaces: Erweiterung & Polymorphie
▪ Zusammenfassung: Einer Methode, deren Parameter den Typ Comparable haben, können sowohl Student-Objekte als auch Car-
Objekte übergeben werden.
public void sort(Comparable[] values) {
int high = values.length – 1;
for (int k = high; k > 0; k–) {
for (int i = 0; i < k; i++) {
if (values[i].compareTo(values[i + 1]) > 0) {
} }
}
this.swap(values, i, i + 1);
}
▪ Welche Implementierung der compareTo()-Methode verwendet
wird, entscheidet der dynamische Datentyp der Objekte, die der
sort()-Methode übergeben werden.
▪ Die abstrakte Klasse Comparable dient lediglich als Datentyp für die
zu sortierenden Objekte.
M. Goedicke – Programmierung WiSe 2020/2021 11
Interfaces: Definitionen
▪ Problem: Da es in JAVA keine Mehrfachvererbung gibt, ist es nicht möglich, einer Klasse auf diese Art und Weise mehrere Datentypen zuzuweisen.
▪ Es existiert das Konzept der Interfaces: eine Klasse kann von einer Oberklasse erben und eine beliebige Anzahl von Interfaces implementieren.
▪ Interfaces werden mit Hilfe des Schlüsselworts interface definiert.
public interface
}
▪ Ein Interface besitzt keine Attribute, keine Konstruktoren und ausschließlich abstrakte Methoden mit dem Sichtbarkeitsmodifikator public.
public interface Comparable {
public abstract int compareTo(Object other);
}
M. Goedicke – Programmierung WiSe 2020/2021 12
Interfaces: Definitionen
▪ Da die Schlüsselwörter public und abstract redundant sind, können sie in der Methodensignatur weggelassen werden.
public interface Comparable { int compareTo(Object other);
}
▪ In UML werden Interfaces unter Verwendung des Klassensymbols und des sogenannten Stereotyps ‹‹interface›› notiert.
‹‹interface›› Comparable
+compareTo(other: Object): int
▪ Interfaces können als Datentyp verwendet werden: public void sort(Comparable[] values)
M. Goedicke – Programmierung WiSe 2020/2021 13
Interfaces: Definitionen
▪ Die Beziehung zwischen einer Klasse und einem Interface wird über das Schlüsselwort implements hergestellt.
▪ Man sagt, dass eine Klasse C von einer Klasse A erbt, aber ein Interface B implementiert.
public class C extends A implements B { …
}
▪ Wenn eine nicht-abstrakte Klasse C ein Interface B implementiert,
dann müssen in C alle Methoden, die in dem Interface vorgegeben
sind, implementiert werden.
▪ Die Instanzen der Klasse C haben dann insbesondere den Datentyp
B, d. h. sie können Variablen vom Typ B zugewiesen werden.
M. Goedicke – Programmierung WiSe 2020/2021 14
A
C
‹‹interface›› B
Interfaces: Verwendung
public class Student implements Comparable { .. .
public int compareTo(Object o) { Student other = (Student)o;
int val = this.name.compareTo(other.name);
if (val == 0) {
val = this.firstName.compareTo(other.firstName); }
return val; }
}
‹‹interface›› Comparable
+compareTo(other: Object): int
Comparable comp = new Student();
int temp = comp.compareTo(comp);
// temp sollte den Wert 0 haben
Student
M. Goedicke – Programmierung WiSe 2020/2021 15
Interfaces: Verwendung
▪ Wenn eine Klasse ein Interface A implementiert, dann dürfen Sichtbarkeit und Parameter der Methoden aus A nicht geändert werden.
Verboten: Sichtbarkeit darf Erlaubt: Parameter dürfen zwar nicht verringert werden nicht geändert werden, Methoden
dürfen aber überladen werden
▪ Der Rückgabetyp einer Methode aus A darf spezialisiert werden.
B
-print(text:String)
‹‹interface›› A
+print(text:String)
C
+print(text:String) +print(text:char[])
‹‹interface›› A
+method():Mutter
B
+method():T ochter
M. Goedicke – Programmierung WiSe 2020/2021 16
Mutter
T ochter
Interfaces: Mehrfachvererbung
▪ Wiederholung: In JAVA gibt es keine Mehrfachvererbung von Klassen, um Konflikte in der Vererbungshierarchie zu vermeiden.
Vater
tuWas(): void
Mutter
tuWas(): void
T ochter
Konflikt 1: Welche Implementierung der tuWas()-Methode wird vererbt?
A
x:int
Konflikt 2: Wie wird das Attribut x vererbt? Besitzt die Klasse D das Attribut x zweimal? (Diamant-Problem)
B
C
D
M. Goedicke – Programmierung WiSe 2020/2021 17
Interfaces: Mehrfachvererbung
▪ In gewisser Weise gibt es in JAVA die Mehrfachvererbung durch Interfaces:
▪ Ein Interface kann mehrere andere Interfaces erweitern.
▪ Eine Klasse kann mehrere Interfaces implementieren.
▪ In einem Interface gibt es nur abstrakte Methoden und keine Attribute ▪ Hier müssen nun einige Regeln gelten, damit alles zusammenpasst
public interface C extends A, B { …
}
‹‹interface›› A
‹‹interface›› C
‹‹interface›› B
‹‹interface›› A
‹‹interface›› B
public class C implements A, B { …
}
C
M. Goedicke – Programmierung WiSe 2020/2021 18
Interfaces: Mehrfachvererbung
▪ In Ermangelung von Attributen und implementierten Methoden kommt es nicht zum Diamantproblem.
▪ Allerdings kann es sein, dass zwei Interfaces Methoden mit gleicher Signatur, aber unterschiedlichem Rückgabetyp definieren.
• Das Erben von beiden Interfaces oder das Implementieren beider Interfaces führt zu einem Kompilierfehler.
• Ausnahme: Wenn der eine Rückgabetyp eine Spezialisierung des anderen Rückgabetyps ist, dann wird dieser Konflikt dadurch gelöst, dass die Implementierung der betroffenen Methode die Spezialisierung als Rückgabetyp erhält.
‹‹interface›› A
+test(): String
‹‹interface›› B
+test(): char[]
‹‹interface›› C
Kompilierfehler
M. Goedicke – Programmierung WiSe 2020/2021 19
Interfaces: Mehrfachvererbung
‹‹interface›› A
+test1():String +test3():void
‹‹interface›› B
+test1():Object +test2():void
C
erlaubt
▪ Der Rückgabetyp der Methode test1() ist die Klasse String, die von der Klasse Object erbt.
public class C implements A, B { public test1() { . . . } public void test2() { . . . } public void test3() { . . . }
}
Object
String
String
M. Goedicke – Programmierung WiSe 2020/2021 20
Gegenüberstellung Interfaces und Abstrakte Klassen
▪ Abstrakte Klassen:
▪ Erlauben die Implementierung vordefinierter Methoden
▪ Sind Teil der Vererbungshierarchie – Änderungen sind somit schwierig,
kritisch und können weitgehende Folgen für die Applikation haben
▪ Neue Typen können somit nicht einfach so eingeführt werden
▪ Erlauben keine Mehrfachvererbung
▪ Interfaces:
▪ Stehen außerhalb der Vererbungshierarchie – jede Klasse kann somit
(nahezu) jedes Interface implementieren
▪ Neue Typen lassen sich einfach einführen, es müssen nur Interfaces
implementiert werden
▪ Klassen können mit implementierten Interfaces zusätzliche Typen haben,
sog. Mixins – Comparable ist so ein Mixin
Quelle: Bloch, J. (2008). Effective Java, Item 18. Addison-Wesley Professional. M. Goedicke – Programmierung WiSe 2020/2021 21
Interfaces realisieren ein wichtiges OOD-Prinzip
▪ Ein wichtiges Prinzip: (Program to Interfaces) es wird gefordert, dass die Implementierung einer Klasse von ihrer Schnittstelle getrennt wird.
▪ Dadurch soll verhindert werden, dass bei der Verwendung einer Klasse unzulässige Annahmen über die – austauschbare – Implementierung der Klasse gemacht werden.
public Bruch(int z, int n) {
zaehler = z;
nenner = n == 0 ? 1 : n; }
public double convert(Bruch bruch) { int zaehler = bruch.getZaehler(); int nenner = bruch.getNenner();
}
Bruch
-zaehler:int -nenner:int
Converter
-convert(Bruch):double
return ((double) zaehler) / nenner;
M. Goedicke – Programmierung WiSe 2020/2021 22
Interfaces realisieren ein wichtiges OOD-Prinzip
▪ Der angegebene Konstruktor public Bruch(int z, int n) verhindert, dass das Attribut nenner mit dem Wert 0 initialisiert werden kann.
▪ Wenn die Implementierung dieses Konstruktors geändert wird, dann kann es in der Methode convert() zu einem Laufzeitfehler
kommen.
‹‹interface›› IBruch
+getZaehler():int +getNenner():int
Converter
-convert(IBruch):double
Bruch
Besser: Da die Klasse Converter nur von einem Interface abhängt, werden keine Annahmen über die Implementierung gemacht. Insbesondere wird davon ausgegangen, dass die Methode getNenner() auch den Wert 0 zurückgeben kann.
public double convert(IBruch bruch) { int zaehler = bruch.getZaehler(); int nenner = bruch.getNenner(); if (nenner != 0)
return ((double) zaehler) / nenner; else . . .
}
M. Goedicke – Programmierung WiSe 2020/2021 23
Interfaces: Statische „Konstanten“
▪ Interfaces deklarieren zwar keine Attribute, sie können aber statische Konstanten mit dem Sichtbarkeitsmodifikator public definieren.
▪ Wie bei den Methoden können die redundanten Schlüsselwörter public, static und final weggelassen werden.
public interface Buyable {
public static final double MAX_PRICE = 1000.; public abstract double getPrice();
}
public interface Buyable {
double MAX_PRICE = 1000.;
double getPrice(); }
‹‹interface›› Buyable
+MAX_PRICE:double
+getPrice():double
M. Goedicke – Programmierung WiSe 2020/2021 24
Interfaces: Statische „Konstanten“
▪ Wenn ein Interface B das Interface A erweitert oder wenn eine Klasse C das Interface A implementiert, dann werden alle Konstanten aus A an B bzw. an C vererbt.
public interface A {
int UPPER_BOUND = 10; …
}
System.out.println(A.UPPER_BOUND); // Ausgabe: 10 System.out.println(B.UPPER_BOUND); // Ausgabe: 10 System.out.println(C.UPPER_BOUND); // Ausgabe: 10
C
‹‹interface›› A
+UPPER_BOUND: int
‹‹interface›› B
M. Goedicke – Programmierung WiSe 2020/2021 25
Interfaces: Statische „Konstanten“
▪ Wenn ein Interface B von mehreren Interfaces A1, . . ., An erbt oder wenn eine Klasse C die Interfaces A1, . . ., An implementiert, dann führen gleichnamige Konstanten zu einem Kompilierfehler:
‹‹interface›› A1
+UPPER_BOUND:int
‹‹interface›› A2
+UPPER_BOUND:int
C
Kompilierfehler
▪ Das Diamant-Problem tritt bei Konstanten aber nicht auf.
public interface B extends A { . . . }
public interface C extends A { . . . }
public class D implements B, C { . . . }
erlaubt
‹‹interface›› A
+UPPER_BOUND:int
M. Goedicke – Programmierung WiSe 2020/2021 26
Interfaces: Statische “Konstanten”
▪ Interfaces sollen nur zur Definition von Typen verwendet werden – ein Interface soll also etwas über eine implementierende Klasse aussagen. Jeder andere Verwendung stellt einen Missbrauch des Konzepts dar!
▪ Negativ-Beispiel: Constant Interface
▪ In einen Interface werden für die Anwendung wichtige Konstanten
gesammelt und stehen so allen implementierenden Klassen zur
Vefügung.
▪ Im JDK findet sich z. B. das Interface ObjectStreamConstants,
welches Konstanten für die Behandlung von Streams enthält.
▪ Problem: Konstanten sind ein Implementierungsdetail, jedoch werden
diese als Teil der Klasse veröffentlicht, wenn das Interface implementiert wird
public interface MathConstants {
static final double PI = 3.14159265359; static final double PHI = 1.6180339887; static final double EULERIAN = 2.718281828;
Better in a different way
}
Quelle: Bloch, J. (2008). Effective Java, Item 19. Addison-Wesley Professional. M. Goedicke – Programmierung WiSe 2020/2021 27
Interfaces: Statische “Konstanten”
▪ Besser:
▪ Konstanten nur an Interfaces hängen, die unabdingbar damit verbunden
sein müssen
▪ Wenn möglich Enums verwenden
▪ Alternative: nichtinstanziierbare Utility Classes
public class MathConstants {
private MathConstants() {}
public static final double PI = 3.14159265359; public static final double PHI = 1.6180339887; public static final double EULERIAN = 2.718281828;
}
Privater Konstruktor verhindert Instanziierung
final kann verwendet werden, um Vererbung zu verhindern
Quelle: Bloch, J. (2008). Effective Java, Item 19. Addison-Wesley Professional. M. Goedicke – Programmierung WiSe 2020/2021 28
Interfaces: Beispiele
▪ Die JAVA-Klassenbibliothek enthält einige wichtige Interfaces. ▪ Beispielsweise ist das bereits erwähnte Interface Comparable
Bestandteil der Klassenbibliothek. Da es sich im Paket java.lang befindet, kann es ohne import-Anweisung verwendet werden.
‹‹interface›› Comparable
+compareTo(other: Object): int
▪ In manchen Situation kann man das Comparable-Interface nicht verwenden – z. B. wenn man nicht der Autor der Klasse ist, deren Instanzen sortiert werden sollen.
▪ In diesen Fällen kann auf das Comparator-Interface zurückgegriffen werden, das sich im Paket java.util befindet.
‹‹interface›› Comparator
+compare(first: Object, second: Object): int
M. Goedicke – Programmierung WiSe 2020/2021 29
Interfaces: Beispiele
▪ Beispielsweise besitzt die Klasse Arrays aus dem Paket java.util die Klassenmethode public static void sort(Object[] a, Comparator c), mit der man ein Array sortieren kann.
▪ Die Ordnung, bzgl. der das Array a sortiert werden soll, wird über den Parameter c definiert.
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
int val = s1.getName().compareTo(s2.getName()); if (val == 0) {
val = s1.getFirstName().compareTo(s2.getFirstName()); }
return val; }
Student
-lastName:String -firstName:String
‹‹interface›› Comparator
MyComparator
M. Goedicke – Programmierung WiSe 2020/2021 30
Interfaces: Beispiele
▪ Für zwei Student-Objekte s1 und s2 gilt dabei:
• compare(s1, s2) < 0, wenn s1 bzgl. der gewählten Ordnungsrelation
kleiner als s2 ist,
• compare(s1, s2) == 0, wenn s1 bzgl. der gewählten
Ordnungsrelation gleich s2 ist,
• compare(s1, s2) > 0, wenn s1 bzgl. der gewählten Ordnungsrelation
größer als s2 ist.
Student
-lastName:String -firstName:String
Student[] a = . . .;
MyComparator c = new MyComparator(); Arrays.sort(a, c);
Kürzere Variante mit einem anonymen Objekt: Student[] a = . . .;
Arrays.sort(a, new MyComparator());
‹‹interface›› Comparator
MyComparator
M. Goedicke – Programmierung WiSe 2020/2021 31
Interfaces: Anonyme Klassen
▪ Eine Klasse, die das Comparator-Interface implementiert, hat
typischerweise zwei Eigenschaften:
• Die Klasse besitzt weder eigenen Methoden noch Attribute.
• Die erzeugten Instanzen der Klasse sind anonyme Objekte.
▪ Es ist umständlich, eine eigene Klasse anzulegen, nur um das Comparator-Interface zu implementieren.
▪ In solchen Fällen kann man daher anonyme Klassen verwenden, um Interfaces zu implementieren.
Student[] a = . . .; Arrays.sort(a, new Comparator() {
public int compare(Object o1, Object o2) { …
} });
anonyme Klasse
M. Goedicke – Programmierung WiSe 2020/2021 32
Interfaces: Anonyme Klassen
▪ Anonyme Klassen können auf die Attribute und Methoden der umgebenden Klasse zugreifen.
▪ Wenn beispielsweise eine Namensliste vorliegt, nach der man die Studierenden sortieren möchte, dann kann das folgendermaßen realisiert werden:
private List namensliste;
public void sort(Student[] a) { Arrays.sort(a, new Comparator() {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
int i1 = namensliste.indexOf(s1.getNachname()); int i2 = namensliste.indexOf(s2.getNachname()); return i1 – i2;
} });
}
Zugriff auf Attribut der umgebenden Klasse
M. Goedicke – Programmierung WiSe 2020/2021 33
Interfaces: Zusammenfassung
▪ Interfaces definieren Typen – sie werden eingesetzt, um einer Klasse mehrere Datentypen zuzuweisen.
▪ Interfaces deklarieren Methoden, die implizit abstract und public
sind.
▪ Eine Klasse B kann mehrere Interfaces A1,…,An implementieren.
Jede Instanz der Klasse B hat dann insbesondere den Datentyp Ai mit 1 ≤ i ≤ n.
∙∙∙
public class B implements A1, . . ., An { . . . }
▪ Die Probleme der Mehrfachvererbung treten dabei nicht auf, da Interfaces keine Attribute enthalten und keine Methoden implementieren.
‹‹interface›› A1
‹‹interface›› An
B
M. Goedicke – Programmierung WiSe 2020/2021 34
Interfaces: Übungen
▪ InterfaceComparable
▪ Beispiel Zahl -> zur Demonstration wie Comparable funktioniert ▪ Beispiel Punkte, Vergleich bzgl. Entfernung zum Ursprung
▪ Beispiel Brüche
▪ InterfaceIterableundIterator.
▪ Spezielle Form der For-Schleife for (p: Struktur) {} . . .
▪ Zwei Bemerkungen
▪ Eigentlich Comparable
im kommenden Kapitel
▪ Die Sammlung der Klassen-Defintionen und Interfaces in java.util werden
wir auch noch beleuchten
M. Goedicke – Programmierung WiSe 2020/2021 35
Interfaces: Übungen
▪ InterfaceComparable
▪ Beispiel Zahl -> zur Demonstration wie Comparable funktioniert
public class Zahl implements Comparable
public Zahl(int zahl){ this.zahl = zahl;
}
public int getZahl(){ return zahl;
}
public void setZahl(int zahl){
this.zahl = zahl; }
.. .
M. Goedicke – Programmierung WiSe 2020/2021 36
Interfaces: Übungen
▪ InterfaceComparable
▪ Beispiel Zahl -> zur Demonstration wie Comparable funktioniert
/*
* Hier ist die vom Interface geforderte Methode.
* Ein weiteres Objekt des Typs Zahl wird uebergeben.
* Wenn unser aktuelles Objekt kleiner ist als der Parameter, * soll -1, wenn es groesser ist 1 und bei Gleichheit
* 0 zurueckgegeben werden.
*/
public int compareTo(Zahl z) { if (this.zahl < z.getZahl()){
return -1;
} else if (this.zahl > z.getZahl()){
return 1; } else {
return 0; }
}
M. Goedicke – Programmierung WiSe 2020/2021 37
Interfaces: Übungen
▪ InterfaceIterable
▪ Beispiel Stack . . . Zeigt wie Iterable funktioniert
▪ Interface erfordert, dass ein sogenannter Iterator implementiert wird
▪ Ein Iterator liefert einen Mechanismus für den Durchlauf einer Struktur ▪ Siehe
▪ http://docs.oracle.com/javase/9/docs/api/java/lang/Iterable.html ▪ http://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html
Beispiel Integer-Stack
class IntStack implements Iterable
public Iterator
return new IntStackIterator();
class ListIterator implements Iterator
}
M. Goedicke – Programmierung WiSe 2020/2021 38
Interfaces: Übungen
▪ InterfaceIterable
▪ Beispiel Stack . . . Zeigt wie Iterable funktioniert
▪ Interface erfordert, dass ein sogenannter Iterator implementiert wird
▪ Ein Iterator liefert einen Mechanismus für den Durchlauf einer Struktur ▪ Siehe
▪ http://docs.oracle.com/javase/9/docs/api/java/lang/Iterable.html ▪ http://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html
Beispiel Integer-Stack
class ListIterator implements Iterator
ListIterator()
{ this.current = first;}
public boolean hasNext() {. . . }
public Integer next() {. . .}
public void remove() { }
}
M. Goedicke – Programmierung WiSe 2020/2021 39