INE2 OOP mit Java 3 Abstrakte Klassen und Interfaces ■ Abstrakte Klassen ■ Interfaces (Schnittstelle) ■ Mehrfachvererbung mit Interfaces ■ Interfaces vs. abstrakte Klassen ■ Innere Klassen ■ Anonyme Klassen ■ Adapterklassen Abstrakte Klassen School of Engineering © G. Burkert, K. Rege, ZHAW 2 von 51 Abstrakte Klassen und Methoden ■ Problemstellung Figure ■ Beispiel: Klassenhierarchie für verschiedene geometrische Figuren wie Rechteck, Kreis, Dreieck int x,y,w,h void draw() getArea() ... ■ Die Klassen für die einzelnen Figuren sollen alle die gleiche Funktionalität haben ■ Methoden, die alle Unterklassen haben müssen, werden in der Oberklasse deklariert Æ Polymorphismus ruft die richtige Methode auf School of Engineering Rectangle Circle int mx,my void draw() void draw() Mögliche Klassenhierarchie für Klasse Figur © G. Burkert, K. Rege, ZHAW 3 von 51 Abstrakte Klassen und Methoden ■ Einige Methode können in der Oberklasse implementiert werden: setSize(int w, int h) setPos(int x, int y) ■ Andere Methoden können hingegen nicht sinnvoll implementiert werden: 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? Æ Abstrakte Methoden und Klassen (abstract class) public abstract void draw(Graphics g); public abstract double getArea(); ■ Abstrakte Methoden zwingen den Programmierer, eigene Implementationen für alle abstrakten Methoden zu schreiben School of Engineering © G. Burkert, K. Rege, ZHAW 4 von 51 Abstrakte Methoden ■ haben nur einen Methodenkopf (Signatur), keinen Methodenkörper ■ haben den Modifikator abstract im Methodenkopf ■ haben einen Strichpunkt (;) nach der Signatur ■ Folge für die Klasse Figur: ■ Sobald eine Methode der Klasse Figur abstract ist, muss auch die Klasse selbst als abstract deklariert sein: public abstract class Figur { public abstract void draw(Graphics g); public abstract double getArea(); } School of Engineering © G. Burkert, K. Rege, ZHAW 5 von 51 Abstrakte Klassen ■ Eine abstrakte Klasse hat mindestens eine abstrakte Methode und/oder ist als abstract deklariert ■ Sie kann nicht instanziert werden! ■ Unterklassen von abstrakten Klassen müssen die abstrakten Methoden implementieren, sonst müssen sie ebenfalls als abstract deklariert sein Figure int x,y,w,h void draw() getArea() ... School of Engineering Figure oder <<abstract>> int x,y,w,h void draw() getArea() ... © G. Burkert, K. Rege, ZHAW 6 von 51 Kontrollfrage ■ Worin unterscheiden sich abstrakte Methoden von Methoden mit leerer Implementation public class Figur{ public void draw(Graphics g) { // leere Methode } public double getArea(){ // leere Methode return 0 // dummy return } } School of Engineering © G. Burkert, K. Rege, ZHAW 7 von 51 Abstrakte Klassen ■ Beispiel: Klasse Rechteck : public class Rectangle extends Figur{ public void draw(Graphics g){ g.drawRect(x, y, w, h); } public double getArea(){ return (double) w*h; } int x,y,w,h void draw() getArea() ... Rectangle } Aufgabe: Leiten Sie die Klasse Circle von der abstrakten Klasse Figur ab School of Engineering Figure © G. Burkert, K. Rege, ZHAW Circle int mx,my void draw() void draw() 8 von 51 Teil-Abstrakte Klassen ■ Bei einer Klasse kann ein gemeinsame Teil implementiert sein. public abstract class Figur{ protected int x,y,w,h; public Figure(int x, int y, int w, int h) { this.x = x; this.y = y;this.w = w; this.w = w; } public void this.x } public void this.w } setPos(int x, int y) { = x; this.y = y; setSize(int w, int h) { = w; this.h = h; public abstract void draw(Graphics g); public abstract double getArea(); } School of Engineering © G. Burkert, K. Rege, ZHAW 9 von 51 Vorteile von abstrakten Klassen ■ Ein bestimmtes Klassendesign kann erzwungen werden! ■ Sie erlaubt die Klassenbeschreibung in höheren Abstraktionsebenen: ■ 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: ■ 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 Klassenhierarchien School of Engineering © G. Burkert, K. Rege, ZHAW 10 von 51 Klassifizierung in (abstrakten) Klassen ■ Zusammenfassen von Eigenschaften gleichartiger Klassen 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 PKWs School of Engineering Zweiräder Nutzfahrzeuge © G. Burkert, K. Rege, ZHAW 11 von 51 Übung ■ Geben Sie je zwei Methoden an, die Sie in der gemeinsamen Oberklasse Fahrzeuge ■ ■ a) als abstrakt deklarieren würden b) deklarieren und implementieren würden ■ Was wäre eine mögliche Oberklasse von Fahrzeug School of Engineering © G. Burkert, K. Rege, ZHAW 12 von 51 Interfaces School of Engineering © G. Burkert, K. Rege, ZHAW 13 von 51 Interfaces = reinabstrakten Klassen Ein Interface definiert eine Schnittstelle zwischen Klassen: ■ Ein Interface ist eine "Klasse", die nur aus Methodenköpfen besteht: public interface Displayable { void draw(Graphics g); } ■ Ein Interface ist im Prinzip eine reinabstrakte Klasse, in welcher sämtliche Methoden abstrakt deklariert sind Æ Bezeichnung interface anstatt class School of Engineering © G. Burkert, K. Rege, ZHAW 14 von 51 Interfaces werden implementiert: implements ■ Klassen erben (extends) nicht von Interfaces sondern implementieren diese (implements) ■ Sie haben Interfaces schon verwendet: public interface ActionListener { public void actionPerformed(ActionEvent event); } java.awt.event public class MyFrame extends Frame implements ActionListener { public void actionPerformed(ActionEvent event) { …………………………… } } ■ sämtliche Methoden eines Interfaces müssen von der Klasse implementiert werden Æ sonst Klasse abstrakt, d.h. kann nicht instanziert werden School of Engineering © G. Burkert, K. Rege, ZHAW 15 von 51 Merkmale eines Interfaces ■ 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 ■ Interfaces definieren wie Klassen einen neuen Datentyp Æ Es können Variablen dieses Datentyps deklariert werden: Displayable dsp; Ein Interface beschreibt nur die Schnittstelle (Klasse, Methoden, Parameter) einer Klasse, nicht deren Implementierung School of Engineering © G. Burkert, K. Rege, ZHAW 16 von 51 …Merkmale eines Interfaces ■ Methoden dürfen nicht static sein ■ Hingegen müssen alle Variablen eines Interfaces static final (d.h. Konstanten) sein ■ Interfaces können übersetzt, aber nicht instanziert werden ■ Das Compilieren erlaubt Typenprüfung bei der Verwendung eines Interfaces if (obj instanceof Displayable) {... ■ Interface Typen können in der Parameterliste von Methoden stehen 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 © G. Burkert, K. Rege, ZHAW 17 von 51 …Merkmale eines Interfaces ■ Interfaces können wie Klassen an Unter-Interfaces weitervererbt werden extends wird in diesem Fall ebenfalls verwendet public interface Verkehrsmittel { } public interface Fahrzeug extends Verkehrsmittel { } ■ es können mehrere Interfaces von einer Klasse implementiert werden class MyFrame extends Frame implements ActionListener, MouseListener { } School of Engineering © G. Burkert, K. Rege, ZHAW 18 von 51 Deklaration von Interfaces ■ Ein Interface beschreibt die Methoden die alle Klassen mindestens implementieren. ■ Für Figuren könnten das z.B. public interface Displayable { void draw(Graphics g); } School of Engineering © G. Burkert, K. Rege, ZHAW 19 von 51 Graphische Darstellung von Interfaces ■ Im Klassenbaum werden Interfaces gekennzeichnet Displayable <<interface>> void draw() ■ Das "implementiert" Symbol ist etwas schlanker als das "erbt" Symbol implementiert implementiert Figure <<abstract>> int x,y,w,h void draw() getArea() ... implementieren implementieren ebenfalls ebenfallsDisplayable Displayable (weil von Figure erben) (weil von Figure erben) Rectangle int mx,my void draw() School of Engineering Circle © G. Burkert, K. Rege, ZHAW void draw() 20 von 51 Implementieren von Interfaces ■ Ein Interface wird durch eine Klasse implementiert. ■ Deklaration einer Klasse, die ein Interface implementiert: class MeineKlasse implements Interfacename {...} ■ Die Klasse muss alle Methoden des Interfaces implementieren Æ implements verpflichtet dazu ! Æ wird vom Compiler überprüft! ■ Klassen, die ein Unter-Interface implementieren, müssen auch alle Methoden der Ober-Interfaces implementieren ■ Eine Klasse kann gleichzeitig mehrere Interfaces implementieren: class MeineKlasse implements Interface1, Interface2,... {...} School of Engineering © G. Burkert, K. Rege, ZHAW 21 von 51 Verwendung von Interfaces ■ Interfaces stellen sicher, dass eine Klasse gewisse Eigenschaften hat bzw. bestimmte Methoden zur Verfügung stellt (implementiert hat).. ■ Es können Variablen von einem Interface Typ erstellt werden Displayable dsp = new Rectange(…); ■ Alle im Interface definierten Methoden müssen von Rectangle implementiert werden Æ können deshalb "sicher" aufgerufen werden. dsp.draw(g); ■ Rectangle kann noch zusätzliche (nicht im Interface deklarierte) Methoden implementieren z.B. getArea(…) ■ Frage: wie kann ich diese aufrufen? School of Engineering © G. Burkert, K. Rege, ZHAW 22 von 51 Sichtbarkeit von Methoden Regel: Der statische Typ (Typ von dem die Variable deklariert wurde) bestimmt, welche Methoden und Attribute bekannt sind. ■ Displayable dsp = new Rectange(…); ■ dsp.getArea(); gilt giltauch auchfür für abstrakte abstrakteund und reguläre Klassen reguläre Klassen ■ Lösung ■ ■ ■ ■ ■ zuerst in Variable mit richtigem statischen Typ zuweisen Rectange rect = (Rectange)dsp; double d = rect.getArea(); oder Cast und Aufruf kombiniert double d = ((Rectangle)dsp).getArea(); ■ Kontrollfrage: funktioniert das auch wenn ich zu Figure caste School of Engineering © G. Burkert, K. Rege, ZHAW 23 von 51 Interfaces: …Beispiel implements implementsDisplayable Displayable import java.awt.*; class Rechteck extends Figure { public void draw(Graphics g){ g.drawRect(xPos, yPos, breite, hoehe); } public double getArea(){ return (double) breite*hoehe; } ... Rechteck (int x, int y, int w, int h) { super(x, y, w, h); } wegen wegenDisplayable Displayable Implementierung der Implementierung der abstrakten abstraktenMethoden Methodender der Klasse Figure Klasse Figure Konstruktor Konstruktor } School of Engineering © G. Burkert, K. Rege, ZHAW 24 von 51 Interfaces: …Beispiel public class FigurTest extends Frame { 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 Kenntdie dieMethoden Methodendraw draw 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); } } } School of Engineering © G. Burkert, K. Rege, ZHAW 25 von 51 Vorteil von Interfaces ■ 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 <<abstract>> Fahrzeug Figure <<abstract>> int x,y,w,h int getAchsen() ... School of Engineering © G. Burkert, K. Rege, ZHAW void draw() getArea() ... 26 von 51 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 public interface Marker { } School of Engineering © G. Burkert, K. Rege, ZHAW 27 von 51 Mehrfachvererbung von Interfaces School of Engineering © G. Burkert, K. Rege, ZHAW 28 von 51 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 Wasserflugzeug schwimmen fliegen links rechts School of Engineering © G. Burkert, K. Rege, ZHAW 29 von 51 Probleme der Mehrfachvererbung von Klassen 1) Aufruf von super nicht mehr eindeutig, z.B. super.links(); ■ 2) 3) Mehrfach geteilte Oberklassen: Diamant Struktur ■ mögliche Lösung: Spezifikation welche Oberklasse gemeint (Motorschiff)super.links(); Verkehrsmittel 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?) Schiff Flugzeug Wasserflugzeug Entscheidung der Java Sprachentwerfer: Mehrfachvererbung von Klassen in Java nicht unterstützen School of Engineering © G. Burkert, K. Rege, ZHAW 30 von 51 Mehrfachvererbung: „Lösung“ mit Interfaces in der Praxis üblich: Interface B Klasse A Hauptlinie der Vererbung Interface C Seiteneinflüsse (Verhaltensvorschriften) Klasse D Java beschränkt sich auf Einfachvererbung, bietet dafür Interfaces (Signaturen von Methoden),welche dann „implementiert“ werden müssen. School of Engineering © G. Burkert, K. Rege, ZHAW 31 von 51 Lösung mit Interfaces interface interface Schwimmen{ Schwimmen{ void schwimmen(); void schwimmen(); }} abstract abstract class class Verkehrsmittel{ Verkehrsmittel{ void links(); void links(); void void rechts(); rechts(); }} Schwimmen <<interface>> Schiff Verkehrsmittel Flugzeug interface interface Fliegen Fliegen {{ void void fliegen(); fliegen(); }} Fliegen <<interface>> implementiert implementiertInterface Interfaceweil weil von Oberklasse geerbt von Oberklasse geerbt Wasserflugzeug Mehrfachvererbung Mehrfachvererbungvon vonInterfaces InterfacesininJava Javaunterstützt unterstützt class Wasserflugzeug extends Flugzeug implements Schwimmen { } School of Engineering © G. Burkert, K. Rege, ZHAW 32 von 51 Mehrfachvererbung von Interfaces im GUI ■ Java erlaubt nur einfache Vererbung! Æ Verwechslungs-Problematik von Methoden bei Mehrfachvererbung wird vermieden ■ Mehrfachvererbung ist aber nachbildbar mit Interfaces, da eine Klasse mehrere Interfaces implementieren kann ■ Beispiel: Das Frame MeinSpiel ist abgeleitet von der Klasse Frame (Vererbung). Zusätzlich soll es die Interfaces ActionListener und MouseListener implementieren: public class MeinSpiel extends Frame implements ActionListener, MouseListener{ ... } School of Engineering © G. Burkert, K. Rege, ZHAW 33 von 51 Vorteile von Interface-Mehrfachvererbung ■ Eine Klasse, die ein Interface implementiert „erbt“ nur die Pflicht die InterfaceMethoden selber zu Programmieren ■ Im Gegensatz zur (mehrfach) Klassenvererbung keine Einsparung der Programmierarbeit! ■ 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 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 © G. Burkert, K. Rege, ZHAW 34 von 51 Klassenbibliothek Beispiel: ActionListener MyFrame Implements ActionListener ActionListener <<interface>> actionPerformed(..) …… Beliebige BeliebigeKlasse KlasseXY XY Implements ImplementsActionListener ActionListener Button B = new Button(); B.addActionListener(this); void actionPerformed(…) ……. Button ButtonBBbekommt bekommtbeim beim „AddActionListener(this)“ „AddActionListener(this)“die dieReferenz Referenz auf aufein einbeliebiges beliebigesObjekt Objekt(MyFrame). (MyFrame). Button ActionListener listener: // Anmeldung von Listener addActionListener (ActionListener l) listener = l; //Eventbehandlung B (Component) listener.actionPerformed(e); Es Eskann kanndort dortaber aber(unabhängig (unabhängigvon vonTyp Typdes des Objekts) Objekts)die dieMethode Methode„ActionPerformed“ „ActionPerformed“aufrufen aufrufen ÆÆweil für die Referenzierung (interne Variable) weil für die Referenzierung (interne Variable) der derInterfaceInterface-und undnicht nichtder derObjekt-Typ Objekt-Typverwendet verwendet wird. wird. School of Engineering © G. Burkert, K. Rege, ZHAW 35 von 51 Interfaces vs. Abstract Classes ■ Interfaces und abstrakte Klassen werden leicht verwechselt. Es bestehen folgende Unterschiede: ■ ■ ■ ■ 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 Unterklasse 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) School of Engineering © G. Burkert, K. Rege, ZHAW 36 von 51 Objekt, Klasse, abstrakte Klasse, Interface ■■ Objekt Objektrepräsentiert repräsentiert Gegenstand/Konzept Gegenstand/KonzeptininSW: SW: ■ ■ ■ ■ ■ ■ extends Zustand Zustand Verhalten Verhalten(Objekt-Methoden) (Objekt-Methoden) Identität Identität ■■ abstrakte abstrakteKlasse Klasseist isthalbfertiger halbfertiger Bauplan: abstact class Bauplan: abstact class ■ ■ ■ ■ kann kannnicht nichtinstanziiert instanziiertwerden werden mindestens eine Methode mindestens eine Methodeals alsabstrakt abstrakt deklariert deklariert new implements extends extends ■■Klasse Klasseist istder derBauplan Bauplaneines eines Objekts: Objekts:class class extends ■■ Interface Interfaceist istdie dieBeschreibung Beschreibungder der Schnittstelle: Interface Schnittstelle: Interface implements ■ 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 ■ es kann nur von einer Klasse geerbt werden: werden:extends extends School of Engineering © G. Burkert, K. Rege, ZHAW kann kannnicht nichtinstanziiert instanziiertwerden werden Interfaces werden von Klassen Interfaces werden von Klassen implementiert: implementiert:implements implements ■ es können mehrere ■ es können mehrereInterfaces Interfacesgleichzeitig gleichzeitig implementiert werden implementiert werden ■ ■ ■ ■ 37 von 51 Innerer Klassen School of Engineering © G. Burkert, K. Rege, ZHAW 38 von 51 Innere Klassen Beispiel Innere Klassen: Beispiel1: ActionListener import java.Frame.Frame; import java.awt.*; import java.awt.event.*; public class InnerDemo extends JFrame { Button helloButton = new Button("Hello"); TextField textfeld = new TextField(" "); Der DerRückgabewert Rückgabewertvon von new() new()wird wirddirekt direktals als Referenz Referenzauf aufdas das Listener-Objekt Listener-Objekt verwendet verwendet public void init() { add(helloButton); add(textfeld); helloButton.addActionListener(new Bearbeiter()); } public void paint(Graphics g) { innere Klasse Bearbeiter } innere Klasse Bearbeiter class Bearbeiter implements ActionListener { public void actionPerformed(ActionEvent e){ textfeld.setText("Hallo Welt"); } } Bearbeiter hat Zugriff auf die } School of Engineering Bearbeiter hat Zugriff auf die Variablen Variablender derumgebenden umgebendenKlasse Klasse © G. Burkert, K. Rege, ZHAW 39 von 51 Innere Klassen ■ Innere Klassen werden innerhalb einer Klasse definiert: class Außen { …. class Innen { } } ■ Sie sind für alle anderen Klassen nicht sichtbar. Æ keine Probleme mit Namenskonflikten ■ 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 School of Engineering © G. Burkert, K. Rege, ZHAW 40 von 51 Anonyme Klassen School of Engineering © G. Burkert, K. Rege, ZHAW 41 von 51 Anonyme (innere) Klasse als ActionListener import java.Frame.Frame; import java.awt.*; import java.awt.event.*; public class AnonymDemo extends Frame { 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) { } } School of Engineering © G. Burkert, K. Rege, ZHAW 42 von 51 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 ■ 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 © G. Burkert, K. Rege, ZHAW 43 von 51 Adapter Klassen School of Engineering © G. Burkert, K. Rege, ZHAW 44 von 51 Adapter-Klassen import java.awt.event.*; class MoveBalloons extends Frame 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 ) {} Alle AlleMethoden Methodeneiner einer Schnittstelle Schnittstellemüssen müssen implementiert implementiertwerden werden (auch (auchwenn wennsie sieleer leersind) sind) .... } School of Engineering © G. Burkert, K. Rege, ZHAW 45 von 51 … Adapter-Klassen ■ 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 ■ Beispiel: eigenständige Java-Applikation mit MouseListener-Adapter public class MoveBalloons extends Frame { Balloon balloon; 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 © G. Burkert, K. Rege, ZHAW 46 von 51 … Adapter als innere Anonyme Klasse class MoveBalloons extends Frame Balloon balloon; public init { Balloon balloon = new Balloon(); this.addMouseListener(new MouseAdapter (){ public void mouseClicked(MouseEvent e) { balloon.setPos(event.getX(), event.getY()); repaint(); } }); } ... } School of Engineering © G. Burkert, K. Rege, ZHAW 47 von 51 Adapterklassen im JDK ■ In Java sind sogenannte Adapterklassen für die meisten EventListener Interfaces vordefiniert: Adapterklassen sind abstrakte Klassen, die das entsprechende Interface implementieren ■ Vorteil: Falls man nur eine Methode braucht, erweitert man einfacher die Adapterklasse, anstatt das ganze Interface zu implementieren ■ 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 © G. Burkert, K. Rege, ZHAW 48 von 51 Zusammenfassung ■ Abstrakte Klassen ■ Interfaces (Schnittstelle) ■ Mehrfachvererbung mit Interfaces ■ Interfaces vs. abstrakte Klassen ■ Innere Klassen ■ Anonyme Klassen ■ Adapterklassen School of Engineering © G. Burkert, K. Rege, ZHAW 49 von 51 Noch Fragen? Gemälde und sein Modell School of Engineering © G. Burkert, K. Rege, ZHAW 50 von 51 Anhang: Interface-Beispiele aus der JavaKlassenbibliothek ■ Interface-Beispiele aus der Java-Klassenbibliothek ■ Die Java-Klassenbibliothek definiert und implementiert selbst eine ganze Reihe von Interfaces. Beispiele: ■ 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 ■ 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 © G. Burkert, K. Rege, ZHAW 51 von 51