Programmieren 2 Java Überblick 1 Klassen und Objekte 2 Vererbung 4 Innere Klassen 5 Exceptions 6 Funktionsbibliothek 7 Datenstrukturen und Algorithmen 8 Ein-/Ausgabe 9 Graphische Benutzeroberflächen 10 Applets 11 Internet-Anwendungen Prof. Dr. Björn Dreher Programmieren 2 - Java 121 Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 122
Englisch: Im Prinzip eine völlig abstrakte Klasse Methoden Keine Implementierung Nur Methodensignatur Methode ist immer öffentlich (public) Klasse, die diese Schnittstelle implementiert, muss alle Methoden der Schnittstelle öffentlich implementieren Keine Attribute, nur... Klassenkonstanten static final Eine Klasse implementiert eine Schnittstelle Syntax public class KonkreteKlasse implements Schnittstelle1, Schnittstelle2 {... Prof. Dr. Björn Dreher Programmieren 2 - Java 123 Eine Klasse kann mehrere Schnittstellen implementieren Ersatz für Mehrfachvererbung Aber keine deren Probleme, da keine Attribute und keine Methodenimplementierung Substitutionsprinzip: ist ein Referenztyp wie eine Klasse Kann alle Objekte der implementierenden Klassen aufnehmen Schnittstelle definiert bestimmte Sicht auf das konkrete Objekt Objekte von Klassen, die mehrere Schnittstellen implementieren, können in verschiedenen Rollen auftreten Prof. Dr. Björn Dreher Programmieren 2 - Java 124
Beispiel public interface Materialeigenschaft { public static final int HART = 0, WEICH = HART+1, FLAUSCHIG = WEICH+1; public int berechnegewicht(); public class Wolle implements Materialeigenschaft { public int berechnegewicht() { return 234; public class Synthetik implements Materialeigenschaft { public int berechnegewicht() { return 452; public abstract class Stahl implements Materialeigenschaft { boolean glänzend; Sprechweise Klassen werden vererbt, Schnittstellen implementiert Alle Methoden einer Schnittstelle sind automatisch abstrakt Prof. Dr. Björn Dreher Programmieren 2 - Java 125 Verwendung public class Materialien { public static void main(string [] args) { Materialeigenschaft [] me = new Materialeigenschaft [2]; me[0] = new Wolle(); me[1] = new Synthetik(); for (int i = 0; i < me.length; i++) System.out.println(i + " hat das Gewicht " + me[i].berechnegewicht()); Schnittstellen zur Definition gemeinsam genutzter Konstanten Schnittstelle ohne Methoden Jede Klasse, die diese Schnittstelle implementiert, besitzt auch die Konstanten Prof. Dr. Björn Dreher Programmieren 2 - Java 126
Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 127 Definition einer gemeinsamen Methodenbasis Unterschiedliche Klassen, die dieselbe Schnittstelle implementieren, implementieren die Schnittstellenmethode unterschiedlich Alle Nachfahrenklassen verstehen den Methodenaufruf, implementieren die Methode aber verschieden Polymorphes Verhalten Atom + protonen(): int Sauerstoff Lithium Helium Wasserstoff + protonen(): int + protonen(): int + protonen(): int + protonen(): int Prof. Dr. Björn Dreher Programmieren 2 - Java 128
Atom public interface Atom { int protonen(); public class Wasserstoff implements Atom { public int protonen() { return 1; public class Helium implements Atom { public int protonen() { return 2; public class Lithium implements Atom { public int protonen() { return 3; public class Sauerstoff implements Atom { public int protonen() { return 8; Prof. Dr. Björn Dreher Programmieren 2 - Java 129 Hauptprogramm public class Atom { public static void main( String[] args ) { char atomkürzel = 'h'; // setze Kürzel mit irgendeinem Wert Atom atom = kürzelzuatom( atomkürzel ); System.out.println( atom.protonen() ); static Atom kürzelzuatom( char kürzel ) { switch ( kürzel ) { case 'h': return new Helium(); case 'o': return new Sauerstoff(); case 'l': return new Lithium(); return new Wasserstoff(); Dynamisches Binden pur! Prof. Dr. Björn Dreher Programmieren 2 - Java 130
Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 131 Unsere Atome sollen auch das java.lang.comparable implementieren Methode public int compareto(object o) Ergebnis je nach Ergebnis des Vergleichs <, = oder > 0 Wasserstoff: public class Wasserstoff implements Atom, Comparable { public int protonen() { return 1; // Aus Atom public int compareto( Object o ) {/*...*/ // Aus Comparable Prof. Dr. Björn Dreher Programmieren 2 - Java 132
Dadurch erhält Wasserstoff zwei Obertypen: Atom und Comparable Die folgenden Zuweisungen sind möglich: Atom w2 = new Wasserstoff(); // kennt protonen() Comparable w3 = new Wasserstoff(); // kennt compareto() Wasserstoff w4 = new Wasserstoff(); // kennt beide Object w1 = new Wasserstoff(); // kennt keine Ggf. muss ein Typecast eingesetzt werden: if (w1 instanceof Wasserstoff) { Wasserstoff w = (Wasserstoff) w1; int i = w.protonen(); int j = w.compareto(w4); Prof. Dr. Björn Dreher Programmieren 2 - Java 133 Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 134
Schnittstelle Vorteil Jede Klasse kann sie implementieren, unabhängig von eigener Erbhierarchie Nachteile Reine API Spezifikation, keine Implementierung mit vielen Methoden: Mühsam, diese in jeder Klasse zu implementieren Eventuell Duplizierung ähnlichen Codes Hinzufügen einer neue Methode hat Konsequenzen für alle Klassen, die diese Schnittstelle bereits implementieren Prof. Dr. Björn Dreher Programmieren 2 - Java 135 Abstrakte Klasse Vorteil Muss nicht vollständig abstrakt sein Nachteil Bestimmtes Verhalten kann hier schon implementiert werden und kann an viele Nachfahrenklassen vererbt werden Nachfahrenklasse kann von keiner anderen Klasse erben Kompromiss Stelle Schnittstelle zur Verfügung Stelle zusätzlich eine (abstrakte) Klasse mit nützlichen Default- Implementierungen zur Verfügung Nachfahrenklassen können davon Gebrauch machen Prof. Dr. Björn Dreher Programmieren 2 - Java 136
Marker s Leere Schnittstelle ohne Methoden und Attribute Klasse implementiert diese Schnittstelle nur, um zu zeigen, dass sie bestimmtes Verhalten besitzt Klasse muss dazu aus Sicht der Schnittstelle nichts implementieren Jede Instanz der Klasse ist auch Instanz der Schnittstelle Kann mit instanceof Operator geprüft werden Beispiel: java.lang.cloneable Kennzeichnet Klasse, dass sie cloneable ist Object o; // Woanders initialisiert Object copy; if (o instanceof Cloneable) copy = o.clone(); else copy = null; Prof. Dr. Björn Dreher Programmieren 2 - Java 137 Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 138
3.5 Vererbung von s Schnittstellen können erweitert werden Analog zur Vererbung von Klassen public interface SchweresAtom extends Atom { double atomgewicht(); Klasse, die SchweresAtom implementiert, muss beide Methoden, atomgewicht() und protonen(), implementieren Schnittstellen können von mehreren anderen Schnittstellen erben! Prof. Dr. Björn Dreher Programmieren 2 - Java 139 3.5 Vererbung von s Vererbung von Konstanten einer Schnittstelle public interface Grundfarben { int ROT = 1; int GRÜN = 2; int BLAU = 3; public interface Sockenfarben extends Grundfarben { int SCHWARZ = 10; int LILA = 11; public interface Hosenfarben extends Grundfarben { int LILA = 11; int SCHWARZ = 20; int BRAUN = 21; public interface Allefarben extends Sockenfarben, Hosenfarben { int BRAUN = 30; Sockenfarben + SCHWARZ: int = 10 + LILA: int = 11 Grundfarben + ROT: int = 1 + GRÜN: int = 2 + BLAU: int = 3 Allefarben + BRAUN: int = 30 Hosenfarben + LILA: int = 11 + SCHWARZ: int = 20 + BRAUN: int = 21 Prof. Dr. Björn Dreher Programmieren 2 - Java 140
3.5 Vererbung von s Vererbung von Konstanten einer Schnittstelle public class VererbteSchnittstellen { public static void main( String args[] ) { System.out.println( Sockenfarben.ROT ); // 1 System.out.println( Allefarben.ROT ); // 1 System.out.println( Hosenfarben.SCHWARZ ); // 20 // System.out.println( Allefarben.SCHWARZ ); // The field name "SCHWARZ" is an ambiguous name // found in the types "Sockenfarben" and // "Hosenfarben". // System.out.println( Allefarben.LILA ); Sockenfarben + SCHWARZ: int = 10 + LILA: int = 11 Grundfarben + ROT: int = 1 + GRÜN: int = 2 + BLAU: int = 3 Hosenfarben + LILA: int = 11 + SCHWARZ: int = 20 + BRAUN: int = 21 Allefarben + BRAUN: int = 30 Prof. Dr. Björn Dreher Programmieren 2 - Java 141 Programmieren 2 Java Überblick: 3. Schnittstellen 3.5 Vererbung von s Prof. Dr. Björn Dreher Programmieren 2 - Java 142
CharSequence der JDK 1.4 Liefert unveränderliche, nur lesbare Teilzeichenkette von String oder StringBuffer Objekten Implementiert von String und StringBuffer Objekte beider Klassen lassen sich als CharSequence Objekte ansehen CharSequence Serializable + length(): int + charat(index: int): char + subsequence(start: int, end: int): CharSequence + tostring(): String Comparable + compareto(o: Object): int StringBuffer String Prof. Dr. Björn Dreher Programmieren 2 - Java 143