Abstrakte Klassen und Interfaces Abstrakte Klassen ■ Abstrakte Klassen ■ Interfaces (Schnittstelle) ■ Mehrfachvererbung mit Interfaces ■ Interfaces vs. abstrakte Klassen ■ Innere Klassen ■ Anonyme Klassen ■ Adapterklassen School of Engineering Abstrakte Klassen und Methoden School of Engineering ■Einige Methode können in der Oberklasse implementiert werden: Figure ■ Beispiel: Klassenhierarchie für verschiedene geometrische Figuren wie Rechteck, Kreis, Dreieck ■ Methoden, die alle Unterklassen haben müssen, werden in der Oberklasse deklariert Æ Polymorphismus ruft die richtige Methode auf 2 von 50 Abstrakte Klassen und Methoden Problemstellung ■ Die Klassen für die einzelnen Figuren sollen alle die gleiche Funktionalität haben © A. Meier/M. Braschler/J. Zeman/K. Rege setSize(int w, int h) setPos(int x, int y) int x,y,w,h ■Andere Methoden können hingegen nicht sinnvoll implementiert werden: void draw() getArea() ... Rectangle public void draw (Graphics g) public double getArea() Problem: Wie stellt man sicher, dass auch zukünftige Unterklassen der Klasse Figur, die gemeinsamen Methoden draw und getArea implementieren? Circle int mx,my void draw() Æ Abstrakte Methoden und Klassen (abstract class) void draw() public abstract void draw(Graphics g); public abstract double getArea(); Mögliche Klassenhierarchie für Klasse Figur © A. Meier/M. Braschler/J. Zeman/K. Rege ■Abstrakte Methoden zwingen den Programmierer, eigene Implementationen für alle abstrakten Methoden zu schreiben 3 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 4 von 50 Abstrakte Klassen Abstrakte Methoden ■haben nur einen Methodenkopf (Signatur), keinen Methodenkörper ■haben den Modifikator abstract im Methodenkopf ■Eine abstrakte Klasse hat mindestens eine abstrakte Methode und/oder ist als abstract deklariert ■haben einen Strichpunkt (;) nach der Signatur ■Sie kann nicht instanziert werden! ■ Unterklassen von abstrakten Klassen müssen die abstrakten Methoden implementieren, sonst müssen sie ebenfalls als abstract deklariert sein Folge für die Klasse Figur: ■Sobald eine Methode der Klasse Figur abstract ist, muss auch die Klasse selbst als abstract deklariert sein: Figure Figure int x,y,w,h public abstract class Figur{ public abstract void draw(Graphics g); public abstract double getArea(); } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege void draw() getArea() ... 5 von 50 School of Engineering int x,y,w,h void draw() getArea() ... © A. Meier/M. Braschler/J. Zeman/K. Rege 6 von 50 Abstrakte Klassen Kontrollfrage ■ Worin unterscheiden sich abstrakte Methoden von Methoden mit leerer Implementation ■ Beispiel: Klasse Rechteck : © A. Meier/M. Braschler/J. Zeman/K. Rege Figure int x,y,w,h class Rectangle extends Figur{ public void draw(Graphics g){ g.drawRect(x, y, w, h); } public double getArea(){ return (double) w*h; } public class Figur{ public void draw(Graphics g) { // leere Methode } public double getArea(){ // leere Methode return 0 // dummy return } } School of Engineering oder <<abstract>> Rectangle } Aufgabe: Leiten Sie die Klasse Circle von der abstrakten Klasse Figur ab 7 von 50 School of Engineering void draw() getArea() ... Circle int mx,my void draw() © A. Meier/M. Braschler/J. Zeman/K. Rege void draw() 8 von 50 Vorteile von abstrakten Klassen Teil-Abstrakte Klassen ■ Bei einer Klasse kann ein gemeinsame Teil implementiert sein. ■Ein bestimmtes Klassendesign kann erzwungen werden! public abstract class Figur{ protected int x,y,w,h; ■Sie erlaubt die Klassenbeschreibung in höheren Abstraktionsebenen: Figure(int x, int y, int w, int h) { this.x = x; this.y = y;this.w = w; this.w = w; } ■ Von der Klasse Figur können keine Objekte (Instanzen) erzeugt werden. ■ Sie fasst alle Objekte mit bestimmten Eigenschaften unter einem neuen Namen zusammen Analogie in der Biologie: void setPos(int x, int y) { this.x = x; this.y = y; } void setSize(int w, int h) { this.w = w; this.h = h; } ■Ein Säugetier existiert selbst nicht (als Spezies), sondern ist ein Sammelbegriff (Abstraktion) von real existierenden Tieren Alles in allem: Æ Abstrakte Klassen erleichtern die Planung und den Aufbau von public abstract void draw(Graphics g); public abstract double getArea(); Klassenhierarchien } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 9 von 50 Klassifizierung in Klassenhierarchien School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 10 von 50 Übung ■ Geben Sie je zwei Methoden an, die Sie in der gemeinsamen Oberklasse Fahrzeuge ■Zusammenfassen von gleichartigen Objekten zu abstrakten Klassen ■Konzentrieren von gemeinsamen Eigenschaften und Methoden in der abstrakten Oberklasse ■ ■ ■Vorschreiben von weiteren Methoden, die in den Unterklassen implementiert werden müssen a) als abstrakt deklarieren würden b) deklarieren und implementieren würden ■ Was wäre eine mögliche Oberklasse von Fahrzeug Zweiräder PKWs Transportfahrzeuge Erdbewegungsfahrzeuge School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 11 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 12 von 50 Interfaces = reinabstrakten Klassen Ein Interface definiert eine Schnittstelle zwischen Klassen: ■Ein Interface ist eine "Klasse", die nur aus Methodenköpfen besteht: public interface Displayable { public void draw(Graphics g); } Interfaces ■Ein Interface ist im Prinzip eine reinabstrakte Klasse, in welcher sämtliche Methoden abstrakt deklariert sind Æ Bezeichnung interface anstatt class School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 13 von 50 Interfaces werden implementiert: implements School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 14 von 50 Merkmale eines Interfaces ■Klassen erben (extends) nicht von Interfaces sondern implementieren diese (implements) ■Sie haben Interfaces schon verwendet: ■Entspricht einer (abstrakten) Klasse, die nur aus Methodeköpfen besteht ■ Methoden sind per Default public (Î public kann auch weglassen werden) ■ Ein Interface ist immer abstract (abstract kann weggelassen werden) Æ Es können deshalb keine Objekte aus einem Interface erzeugt werden public interface ActionListener { public void actionPerformed(ActionEvent event); } java.awt.event ■Interfaces definieren wie Klassen einen neuen Datentyp Æ Es können Variablen dieses Datentyps deklariert werden: Displayable dsp; public class MyApplet extends Applet implements ActionListener { public void actionPerformed(ActionEvent event) { …………………………… } Ein Interface beschreibt nur die Schnittstelle (Klasse, Methoden, Parameter) einer Klasse, nicht deren Implementierung } ■sämtliche Methoden eines Interfaces müssen von der Klasse implementiert werden Æ sonst Klasse abstrakt, d.h. kann nicht instanziert werden School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 15 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 16 von 50 …Merkmale eines Interfaces …Merkmale eines Interfaces ■Methoden dürfen nicht static sein ■Interfaces können wie Klassen an Unter-Interfaces weitervererbt werden extends wird in diesem Fall ebenfalls verwendet ■Hingegen müssen alle Variablen eines Interfaces static final (d.h. Konstanten) sein public interface Verkehrsmittel { } ■Interfaces können übersetzt, aber nicht instanziert werden public interface Fahrzeug extends Verkehrsmittel { } ■ Das Compilieren erlaubt Typenprüfung bei der Verwendung eines Interfaces ■es können mehrere Interfaces von einer Klasse implementiert werden if (obj instanceof Displayable) {... ■ Interface Typen können in der Parameterliste von Methoden stehen class MyApplet extends Applet implements ActionListener, MouseListener { void foo (Displayable d) {... -> erzwingt, dass nur Objekte übergeben werden können, deren Klasse ein bestimmtes Interface implementiert z.B. addActionListener(ActionListener l) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 17 von 50 Deklaration von Interfaces } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 18 von 50 Graphische Darstellung von Interfaces ■Ein Interface beschreibt die Methoden die alle Klassen mindestens implementieren. ■ Im Klassenbaum werden Interfaces gekennzeichnet ■Für Figuren könnten das z.B. ■ Das "implementiert" Symbol ist etwas schlanker als das "erbt" Symbol Displayable <<interface>> void draw() implementiert implementiert Figure <<abstract>> int x,y,w,h void draw() getArea() ... public interface Displayable { void draw(Graphics g); } implementieren implementieren ebenfalls Displayable ebenfalls Displayable (weil von Figure erben) (weil von Figure erben) Rectangle int mx,my void draw() School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 19 von 50 School of Engineering Circle © A. Meier/M. Braschler/J. Zeman/K. Rege void draw() 20 von 50 Verwendung von Interfaces Implementieren von Interfaces ■Ein Interface wird durch eine Klasse implementiert. ■Interfaces stellen sicher, dass eine Klasse gewisse Eigenschaften hat bzw. bestimmte Methoden zur Verfügung stellt (implementiert hat).. ■Deklaration einer Klasse, die ein Interface implementiert: ■Es können Variablen von einem Interface Typ erstellt werden class MeineKlasse implements Interfacename {...} ■Die Klasse muss alle Methoden des Interfaces implementieren Æ implements verpflichtet dazu ! Displayable dsp = new Rectange(…); ■Alle im Interface definierten Methoden müssen von Rectangle implementiert werden Æ können deshalb "sicher" aufgerufen werden. Æ wird vom Compiler überprüft! dsp.draw(g); ■Klassen, die ein Unter-Interface implementieren, müssen auch alle Methoden der Ober-Interfaces implementieren ■Rectangle kann noch zusätzliche (nicht im Interface deklarierte) Methoden implementieren z.B. getArea(…) ■Eine Klasse kann gleichzeitig mehrere Interfaces implementieren: ■Frage: wie kann ich diese aufrufen? class MeineKlasse implements Interface1, Interface2,... {...} School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 21 von 50 Regel: Der statische Typ (Typ von dem die Variable deklariert wurde) bestimmt, welche Methoden und Attribute bekannt sind. dsp.getArea(); © A. Meier/M. Braschler/J. Zeman/K. Rege 22 von 50 Interfaces: …Beispiel Sichtbarkeit von Methoden Displayable dsp = new Rectange(…); School of Engineering implements implementsDisplayable Displayable import java.awt.*; class Rechteck extends Figure { public void draw(Graphics g){ g.drawRect(xPos, yPos, breite, hoehe); } gilt giltauch auchfür für abstrakte abstrakteund und reguläre Klassen reguläre Klassen public double getArea(){ return (double) breite*hoehe; } ■ Lösung ■ zuerst in Variable mit richtigem statischen Typ zuweisen Rectange rect = (Rectange)dsp; ... Rechteck (int x, int y, int w, int h) { super(x, y, w, h); } double d = rect.getArea(); ■ oder Cast und Aufruf kombiniert wegen wegenDisplayable Displayable Implementierung der Implementierung der abstrakten Methoden der abstrakten Methoden der Klasse Figure Klasse Figure Konstruktor Konstruktor } double d = ((Rectangle)dsp).getArea(); ■ Kontrollfrage: funktioniert das auch wenn ich zu Figure caste School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 23 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 24 von 50 Interfaces: …Beispiel Vorteil von Interfaces public class FigurTest extends Applet { Displayable [] dsp = new Displayable[2]; public void init() { dsp [0] = new Rechteck(10, 20, 100, 60); dsp [1] = new Kreis(10,100,30); } Array Arrayvom vomInterface-Typ Interface-Typ(Displayable) (Displayable) ÆÆKennt die Kennt dieMethoden Methodendraw draw ■ Es kann etwas dargestellt werden, sobald das Displayable Interface implementiert wird; man muss grundsätzlich nicht von Figure erben. Displayable <<interface>> void draw() implementiert implementiert public double getArea(int dx){ double totArea= 0; for (int i=0; i<dsp.length; i++){ totArea+= ((Figure)dsp[i]).getArea(); } return totArea; } Displayable kennt nicht die Methode Displayable kennt nicht die Methode public void paint(Graphics g) { getArea (von Klasse Figure) getArea (von Klasse Figure) for (int i=0; i<dsp.length; i++){ Î Type-Cast notwendig Î Type-Cast notwendig dsp[i].draw(g); } } <<abstract>> Fahrzeug Figure <<abstract>> int x,y,w,h int getAchsen() ... void draw() getArea() ... } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 25 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 26 von 50 Kontrollfragen ■ was ist in folgendem Interface falsch public interface SomethingIsWrong { public void aMethod(int aValue){ System.out.println("Hi Mom"); } } ■ was ist in folgendem Interface falsch Mehrfachvererbung von Interfaces public interface Marker { } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 27 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 28 von 50 Probleme der Mehrfachvererbung von Klassen Mehrfachvererbung von Klassen (z.B C++) ■Durch Mehrfachvererbung könnten auch komplexe Vererbungsbeziehungen ausgedrückt werden, Bsp: Schiff Flugzeug schwimmen fliegen links links rechts rechts 1) Aufruf von super nicht mehr 3) Mehrfach geteilte Oberklassen: Diamant Struktur eindeutig, z.B. super.links(); ■ 2) ■ mögliche Lösung: Spezifikation welche Oberklasse gemeint (Motorschiff)super.links(); Mehrere Oberklassen: welcher Konstruktor wird aufgerufen? ■ mögliche Lösung beide: ■ (Motorschiff)super(); ■ (Motorfahrzeug)super(); zusätzliche Probleme: welcher Konstruktor über welches Verkehrsmittel wird aufgerufen (Reihenfolge?, wie oft?) Verkehrsmittel Schiff Flugzeug Wasserflugzeug Wasserflugzeug schwimmen fliegen Entscheidung der Java Sprachentwerfer: Mehrfachvererbung von Klassen in Java nicht unterstützen links rechts School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 29 von 50 in der Praxis üblich: interface interface Schwimmen{ Schwimmen{ void void schwimmen(); schwimmen(); }} Interface B Hauptlinie der Vererbung © A. Meier/M. Braschler/J. Zeman/K. Rege 30 von 50 Lösung mit Interfaces Mehrfachvererbung: „Lösung“ mit Interfaces Klasse A School of Engineering abstract abstract class class Verkehrsmittel{ Verkehrsmittel{ void void links(); links(); void rechts(); void rechts(); }} Interface C Schwimmen <<interface>> Verkehrsmittel Seiteneinflüsse (Verhaltensvorschriften) Schiff Flugzeug Klasse D interface interface Fliegen Fliegen {{ void void fliegen(); fliegen(); }} Fliegen <<interface>> implementiert implementiertInterface Interfaceweil weil von vonOberklasse Oberklassegeerbt geerbt Wasserflugzeug Java beschränkt sich auf Einfachvererbung, bietet dafür Interfaces (Signaturen von Methoden),welche dann „implementiert“ werden müssen. Mehrfachvererbung Mehrfachvererbungvon vonInterfaces InterfacesininJava Javaunterstützt unterstützt class Wasserflugzeug extends Flugzeug implements Schwimmen { } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 31 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 32 von 50 Vorteile von Interface-Mehrfachvererbung Mehrfachvererbung von Interfaces im GUI ■ Java erlaubt nur einfache Vererbung! Æ Verwechslungs-Problematik von Methoden bei Mehrfachvererbung wird vermieden ■ Eine Klasse, die ein Interface implementiert „erbt“ nur die Pflicht die Interface- ■ Mehrfachvererbung ist aber nachbildbar mit Interfaces, da eine Klasse mehrere Interfaces implementieren kann ■ Im Gegensatz zur (mehrfach) Klassenvererbung keine Einsparung der Methoden selber zu Programmieren Programmierarbeit! ■ Beispiel: Das Applet MeinSpiel ist abgeleitet von der Klasse Applet (Vererbung). Zusätzlich soll es die Interfaces ActionListener und MouseListener implementieren: ■ Vorteile ■ Eine zweite Interfacehierarchie, unabhängig von "Klassen-Stammbaum" ■ Man kann überall anstelle einer Klasse auch ein Interface verwenden Æ eine Variable vom Schnittstellentyp Æ von jedem Objekt, auf welches sich die Variable bezieht, angenommen public class MeinSpiel extends Applet implements ActionListener, MouseListener{ ... } wird, es habe diese Schnittstelle implementiert ■ Man kann ein Objekt, dass ein Interface Z implementiert mit einer Variable vom Typ interface Z referenzieren und dort eine dazugehörige Interface-Methode (meth1) aufrufen ■ Das erlaubt Applikationen zu schreiben, die unbekannte Klassen benutzen können (solange diese eine vereinbarte Schnittstelle implementieren) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 33 von 50 Klassenbibliothek Beispiel: ActionListener MyApplet Implements ActionListener ActionListener <<interface>> ■ void actionPerformed(…) ……. ■ Button ButtonBBbekommt bekommtbeim beim „AddActionListener(this)“ „AddActionListener(this)“die dieReferenz Referenz auf aufein einbeliebiges beliebigesObjekt Objekt(MyApplet). (MyApplet). Button ActionListener listener: 34 von 50 ■ Interfaces und abstrakte Klassen werden leicht verwechselt. Es bestehen folgende Unterschiede: ■ Beliebige BeliebigeKlasse KlasseXY XY Implements ImplementsActionListener ActionListener Button B = new Button(); B.addActionListener(this); © A. Meier/M. Braschler/J. Zeman/K. Rege Interfaces vs. vs. Abstract Classes actionPerformed(..) …… School of Engineering ■ // Anmeldung von Listener addActionListener (ActionListener l) listener = l; Eine abstrakte Klasse kann eine Implementierung von einer oder mehreren Methoden zur Verfügung stellen. Ein Interfaces stellt nie eine Implementierung zur Verfügung. Eine Klasse kann mehrere Interfaces implementieren, aber nur eine abstrakte Klasse erweitern. Ein Interface wir vom Compiler für Überprüfungen benutzt. Im Gegensatz dazu hat eine abstrakte Klasse Vererbung zur Folge, die das Einbinden der entsprechenden Methoden während der Laufzeit nach sich zieht. Eine abstrakte Klasse hat zur Folge, dass ihre abstrakten Methoden in der Subklasse implementiert werden Æ Vererbung wird angenommen. Aber ein Interface stellt einfach ein Skelett für eine Klasse dar, ohne jegliche Andeutung, dass sie zur Vererbung benutzt wird (Jedoch kann ein Interface Vererbung festlegen) //Eventbehandlung B (Component) listener.actionPerformed(e); Es kann dort aber (unabhängig von Typ des Es kann dort aber (unabhängig von Typ des Objekts) die Methode „ActionPerformed“ aufrufen Objekts) die Methode „ActionPerformed“ aufrufen Æ weil für die Referenzierung (interne Variable) Æ weil für die Referenzierung (interne Variable) der Interface- und nicht der Objekt-Typ verwendet der Interface- und nicht der Objekt-Typ verwendet wird. wird. School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 35 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 36 von 50 Objekt, Klasse, abstrakte Klasse, Interface ■■ Objekt Objektrepräsentiert repräsentiert Gegenstand/Konzept Gegenstand/KonzeptininSW: SW: ■ ■ ■ ■ ■ ■ extends ■■ abstrakte abstrakteKlasse Klasseist isthalbfertiger halbfertiger Bauplan: Bauplan:abstact abstactclass class ■ ■ ■ ■ Zustand Zustand Verhalten (Objekt-Methoden) Verhalten (Objekt-Methoden) Identität Identität kann kannnicht nichtinstanziiert instanziiertwerden werden mindestens mindestenseine eineMethode Methodeals alsabstrakt abstrakt deklariert deklariert new ■■Klasse Klasseist istder derBauplan Bauplaneines einesObjekts: Objekts: class class ■ Datentypen der Attribute ■ Datentypen der Attribute ■ Beschreibung der Objektmethoden ■ Beschreibung der Objektmethoden ■ Beschreibung der Klassenmethoden ■ Beschreibung der Klassenmethoden ■ es kann nur von einer Klasse geerbt werden: ■ es kann nur von einer Klasse geerbt werden: extends ■■ Interface Interfaceist istdie dieBeschreibung Beschreibungder der Schnittstelle: Schnittstelle:Interface Interface implements extends extends School of Engineering kann kannnicht nichtinstanziiert instanziiertwerden werden Interfaces Interfaceswerden werdenvon vonKlassen Klassen implementiert: implementiert:implements implements ■ es können mehrere Interfaces ■ es können mehrere Interfacesgleichzeitig gleichzeitig implementiert implementiertwerden werden ■ ■ ■ ■ © A. Meier/M. Braschler/J. Zeman/K. Rege 37 von 50 Innere Klassen Beispiel 38 von 50 class Außen { …. class Innen { } } Der DerRückgabewert Rückgabewertvon von new() new()wird wirddirekt direktals als Referenz "); Referenzauf aufdas das Listener-Objekt Listener-Objekt verwendet verwendet ■Sie sind für alle anderen Klassen nicht sichtbar. Æ keine Probleme mit Namenskonflikte public void init() { add(helloButton); add(textfeld); helloButton.addActionListener(new Bearbeiter()); } public void paint(Graphics g) { innere } innereKlasse KlasseBearbeiter Bearbeiter class Bearbeiter implements ActionListener { public void actionPerformed(ActionEvent e){ textfeld.setText("Hallo Welt"); } } Bearbeiter hat Zugriff auf die School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege ■Innere Klassen werden innerhalb einer Klasse definiert: import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class InnerDemo extends Applet { Button helloButton = new Button("Hello"); TextField textfeld = new TextField(" School of Engineering Innere Klassen Innere Klassen: Beispiel1: ActionListener } Innerer Klassen implements extends extends ■sie können auf Methoden und Variablen im Gültigkeitsbereich der übergeordneten Klasse zugreifen, auf die sie sonst von einer eigenständigen Klasse nicht zugreifen könnten !!! ■Meist kleine Klassen, die nur für eine sehr eingeschränkte Aufgabe zuständig sind. ■Anwendungsbeispiel: u.a. Implementierung des Listener Interface wenn der Listener als separate Klasse realisiert wird Bearbeiter hat Zugriff auf die Variablen der umgebenden Klasse Variablen der umgebenden Klasse © A. Meier/M. Braschler/J. Zeman/K. Rege 39 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 40 von 50 Anonyme (innere) Klasse als ActionListener import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class AnonymDemo extends Applet { Button helloButton = new Button("Hello"); TextField textfeld = new TextField(10); Kein KeinKlassenname Klassennamedefiniert definiert! ! ÆÆanonyme anonymeKlasse Klasse Die DieKlasse Klassewird wirdbei beider derErzeugung Erzeugung direkt direktausprogrammiert. ausprogrammiert. public void init() { add(helloButton); add(textfeld); helloButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ textfeld.setText("Hallo Welt"); } } ); } public void paint(Graphics g) { } Anonyme Klassen } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 41 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 42 von 50 Anonyme Klasse: Zusammenfassung ■Sind lokale Klassen ohne Namen, ■Werden in genau einer Anweisung deklariert, instanziert und benutzt. ■Anonyme Klassen sind die schnellste Möglichkeit, kleinere Ereignisbehandlungen durchzuführen Adapter Klassen ■Anonyme Klassen machen nur dann Sinn, wenn sie nur einmal im Programm benutzt (instanziert) werden. Æ z.B. Pro GUI-Komponente eine (anonyme) Event-Listener-Klasse ■ Bei erfolgreicher Übersetzung erscheinen anonyme Klassen unter der Bezeichnung der umgebenden Klasse mit klasse$1.class, klasse$2.class, ... für jede anonyme Klasse im Dateiverzeichnis. School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 43 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 44 von 50 Adapter-Klassen … Adapter-Klassen import java.awt.event.*; ■Implementieren dazugehörige Schnittstelle (mit leeren Methoden) ■Vorteil: weniger Schreibarbeit, man überschreibt nur diejenige Methoden, die nicht leer sein sollen. ■Es gibt u.a. MouseListener-Interface und MouseAdapter-Klassen class MoveBalloons extends Applet implements MouseListener { Balloon balloon = new Balloon(); public init { addMouseListener(this); Balloon balloon = new Balloon(); } // Implementiere MouseListener public void mouseClicked(MouseEvent event ) { balloon.setPos(event.getX(), event.getY()); repaint(); } public void mouseEntered(MouseEvent event ) {} public void mouseExited(MouseEvent event ) {} public void mousePressed(MouseEvent event ) {} public void mouseReleased(MouseEvent event ) {} ■Beispiel: eigenständige Java-Applikation mit MouseListener-Adapter public class MoveBalloons extends Applet { Balloon balloon; Alle AlleMethoden Methodeneiner einer Schnittstelle Schnittstellemüssen müssen implementiert implementiertwerden werden (auch (auchwenn wennsie sieleer leersind) sind) public init { this.addMouseListener(new BalloonMover ()); Balloon balloon = new Balloon(); } class BalloonMover extends MouseAdapter { innere innereKlasse KlasseBalloonMover BalloonMover public void mouseClicked(MouseEvent e) { balloon.setPos(event.getX(), event.getY()); repaint(); .... } } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 45 von 50 … Adapter als innere Anonyme Klasse } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 46 von 50 Adapterklassen im JDK ■In Java sind sogenannte Adapterklassen für die meisten EventListener Interfaces vordefiniert: class MoveBalloons extends Applet Balloon balloon; Adapterklassen sind abstrakte Klassen, die das entsprechende Interface implementieren public init { Balloon balloon = new Balloon(); this.addMouseListener(new MouseAdapter (){ public void mouseClicked(MouseEvent e) { ■Vorteil: Falls man nur eine Methode braucht, erweitert man einfacher die Adapterklasse, anstatt das ganze Interface zu implementieren balloon.setPos(event.getX(), event.getY()); repaint(); } }); ■Beispiel: MouseListener Interface schreibt vor, dass die 5 Methoden mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased implementiert werden müssen } ... } Æ Auch wenn man z.B. nur mouseClicked braucht, müssen die anderen trotzdem geschrieben werden School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 47 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 48 von 50 Anhang: Interface-Beispiele aus der JavaKlassenbibliothek Zusammenfassung ■ Abstrakte Klassen ■Interface-Beispiele aus der Java-Klassenbibliothek ■ Interfaces (Schnittstelle) ■ Mehrfachvererbung mit Interfaces ■Die Java-Klassenbibliothek definiert und implementiert selbst eine ganze Reihe von Interfaces. Beispiele: ■ Interfaces vs. abstrakte Klassen ■ Innere Klassen ■ Anonyme Klassen ■ Adapterklassen ■Listeners ■ Erlauben, dass Objekte (wie z.B. Button) in einem (von Aufbau und Typ her unbekannten Objekt) die Listener-Methode (wir zB. actionPerformed) aufrufen können. ■Runnable ■ ■ wird zur Implementierung von Threads verwendet, und zwar insbesondere dann, wenn die betreffende Klasse selbst nicht direkt aus Thread abgeleitet werden kann. deklariert lediglich die Methode run, deren Rumpf den ausführbaren Code des Threads enthält. Der Umgang mit Threads wird in einer späteren Lektion erklärt. ■Comparable ■ ■ School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 49 von 50 Deklariert die Methode compareTo(Object o) Erlaubt u.a. dass Arrays von Objekten, die Comparable implementieren automatisch sortiert werden können (mit Arrays.sort) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 50 von 50