Einführung in Java Präsentation Interfaces Nozar Delassaei Marvi Inhalt 1. Erinnerung Klasse Objekte Beispiel Klasse Abstrakte Klasse Beispiel Abstrakte Klasse Mehrfachvererbung-1 Mehrfachvererbung-2 2. Interfaces Definition, Implementierung und Verwendung von Interfaces Das Interface Comparable Implementierung mehrerer Interfaces Vererbung von Interfaces Ableiten von Interfaces Konstanten in Interfaces und static imports Flag-Interfaces Methode clone Nachbildung von Funktionszeigern Die Default-Implementierung eines Interface Delegation an eine Default-Implementierung Nozar Delassaei Marvi / HAW Hamburg 2 Klasse // Klasse: Eine Klasse beinhaltet Datenmember und Methoden, wie diese zu bearbeiten sind. // Die Datei muss dann den Namen der öffentlichen Klasse zuzüglich der Extension .java tragen. // Nach der Übersetzung durch den Compiler hat das Ergebnis die Extension .class. Nozar Delassaei Marvi / HAW Hamburg 3 Objekte Was ist ein „Objekt“? // Klassen dienen als Vorlage für viele einzelne Exemplare (Objekte). // Objekte sind Referenzdatentypen. Nozar Delassaei Marvi / HAW Hamburg 4 Beispiel „Klasse“ public class Auto { public String name; private int PS; public int getPS() { return PS; } } Nozar Delassaei Marvi / HAW Hamburg 5 Abstrakte Klasse // Was ist ein abstrakte Klasse? // Eine abstrakte Klasse ist in Java eine Klassendefinition, die ausschließlich der Vererbung ihres Inhaltes dient. //Eine abstrakte Klasse kann keine privaten Methoden haben. // Ein abstrakte Klasse kann als Basisklasse verwendet werden. Nozar Delassaei Marvi / HAW Hamburg 6 Syntax // Allgemeiner Aufbau lautet: abstract class Klassenname { public abstract void abstrakteMethode() { } public void konkrete Methode() { } ... } Nozar Delassaei Marvi / HAW Hamburg 7 Mehrfachvererbung-1 Ein Objekt kann die Eigenschaften aus mehreren Klassen beziehen, ein Objekt kann mehrere Schnittstellen besitzen. Autos und Schiffe sind Unterklassen von Fahrzeugen, Amphibienfahrzeug ist sowohl Auto als auch Schiff. Æ Mehrfachvererbung Nozar Delassaei Marvi / HAW Hamburg 8 Mehrfachvererbung-2 // Mit Mehrfachvererbung kann eine Klasse ohne großen Aufwand aus bestehenden Klassen zusammengesetzt werden. // Die beerbende Klasse enthält alle Datenfelder und alle Methoden aus allen beerbten Klassen. Nozar Delassaei Marvi / HAW Hamburg 9 Es gibt ein Problem! keine Mehrfachvererbung von Klassen in Java!!! // Eine grundsätzlich Designentscheidung der Java-Erfinder war, keine Mehrfachvererbung zu unterstützen. Æ Die Gründe: a) möglichen Schwierigkeiten beim Umgang mit mehrfacher Vererbung b) Das Erben nichttrivialer Methoden aus mehr als einer Klasse in der Praxis ist selten zu realisieren. Æ Die Lösung ..... Nozar Delassaei Marvi / HAW Hamburg 10 Interfaces (Schnittstelle) Æ Mit der Hilfe von Interfaces bietet Java eine Konstruktion an, solche Anforderungen zu lösen. Nozar Delassaei Marvi / HAW Hamburg 11 Definition // Ein Interface ist eine besondere Form einer Klasse, die ausschließlich abstrakte Methoden und Konstanten enthält. // Anstelle des Schlüsselwortes class wird ein Interface mit dem Schlüsselwort interface deklariert. // Eine Interface-Variable ist kompatibel zu allen Objekten, deren Klassen dieses Interface implementieren. Nozar Delassaei Marvi / HAW Hamburg 12 Syntax // Syntax [Modifikator] interface Interface { [final] [Modifikator] Typ Variable = Wert; [abstract] [Modifikator] Typ Methode(); } //Quellcode: interface MyInterface { public int i = 0; public void print(); } Nozar Delassaei Marvi / HAW Hamburg 13 // Durch die Definition wird die Schnittstelle (interface) nur beschrieben, die gewünschte Funktionalität wird noch nicht zur Verfügung gestellt. // Das folgende Listing definiert ein Interface „Groesse“, das die drei Methoden laenge, hoehe und breite enthält. Nozar Delassaei Marvi / HAW Hamburg 14 Implementierung eines Interface // Soll die gewünschte Funktionalität von Klassen realisiert werden, muss diese zuerst implementiert werden. Die neue gewünschte Funktionalität erweitert die „class-Anweisung“ um eine „implementsKlausel“. Hinter der Klausel wird der Name der zu implementierenden Interface angegeben. Jetzt ist die Aufgabe der Compiler, um alle im Interface geforderten Methoden definitionsgemäß zu implementieren. (Beispiele: Auto2 und Fußballplatz ) // Die Art der Realisierung der vereinbarten Methoden spielt für das Implementieren eines Interface keine Rolle. Tatsächlich kommt es ausgesprochen häufig vor, dass Interfaces von sehr unterschiedlichen Klassen implementiert und die erforderlichen Methoden auf sehr unterschiedliche Weise realisiert werden. Nozar Delassaei Marvi / HAW Hamburg 15 Verwenden eines Interface // Ein einfaches Beispiel für die Anwendung des Interfaces: Dazu soll eine Methode „grundflaeche“ entwickelt werden, die zu jedem Objekt, das das Interface „Groesse“ implementiert, dessen Grundfläche (Länge mal Breite) berechnet. (Beispiel 0905) Nozar Delassaei Marvi / HAW Hamburg 16 Das Interface Comparable Dieses Interface kann von Klassen implementiert werden, deren Objekte paarweise vergleichbar sind. Die Methode compareTo liefert genau dann einen Wert kleiner 0, wenn das Objekt »kleiner«; größer 0, wenn es »größer«, und gleich 0, wenn es »gleich« dem als Argument übergebenen Objekt o ist. (Beispiel Listing 0907) Mit Hilfe von Comparable kann die Reihenfolge der Objekte einer Klasse ermittelt werden. Aus dem Paarweisen Vergleich lässt sich eine implizite Ordnung der Elemente ableiten, denn für alle aufeinander folgenden Objekte a und b muss a.compareTo(b) <= 0 gelten. Nozar Delassaei Marvi / HAW Hamburg 17 Mehrfachimplementierung und Vererbung 1. Mehrfachimplementierung // Es ist durchaus möglich, dass eine Klasse mehrere Interfaces implementiert. Sie muss dann zu jedem Interface alle darin definierten Methoden implementieren. // Mit jedem implementierten Interface wird sie zu dem dadurch definierten Datentyp kompatibel. Eine Klasse, die n Interfaces implementiert, ist demnach zu n + 1 Datentypen (plus ihren jeweiligen Oberklassen) kompatibel. (Beispiel Auto3) Nozar Delassaei Marvi / HAW Hamburg 18 Mehrfachimplementierung und Vererbung 2. Vererbung von Interfaces // Wenn eine Klasse die Interfaces seiner Basisklasse erbt: Auto4 erbt von Auto2 nicht nur die Implementierung, sondern auch die Klausel „implements Groesse“ und erweitert sie um die Implementierung von Comparable. Æ Damit ist Auto4 gleichwertig zu Auto3 Nozar Delassaei Marvi / HAW Hamburg 19 Mehrfachimplementierung und Vererbung 3. Ableiten von Interfaces // Auch Interfaces selbst können abgeleitet werden. Ähnlich einer Klasse erbt das abgeleitete Interface alle Methodendefinitionen des BasisInterfaces. // Die implementierende Klasse muss also auch alle Methoden von allen übergeordneten Interfaces implementieren. Nozar Delassaei Marvi / HAW Hamburg 20 Weitere Anwendungen von Interfaces 1.Konstanten in Interfaces // Interfaces können auch Konstanten, also Membervariablen mit den Attributen static und final, enthalten. Wenn eine Klasse ein Interface implementiert, erbt es auch alle seine Konstanten. ÆEs ist auch erlaubt, dass ein Interface ausschließlich Konstanten enthält. // Dieses Feature kann zum Beispiel nützlich sein, wenn ein Programm sehr viele Konstanten definiert. Anstatt sie in ihren eigenen Klassen zu belassen und bei jedem Gebrauch durch den qualifizierten Ausdruck Klasse.Name aufzurufen, könnte ein Interface definiert werden, das alle Konstantendefinitionen vereinigt. Wenn nun jede Klasse, in der diese Konstanten benötigt werden, dieses Interface implementiert, stehen alle darin definierten Konstanten direkt zur Verfügung und können ohne qualifizierten Klassennamen aufgerufen werden. Nozar Delassaei Marvi / HAW Hamburg 21 Weitere Anwendungen von Interfaces 1.1 static import Seit der J2SE 5.0 gibt es eine Möglichkeit, statische Teile aus Klassen und Interfaces unqualifiziert zu benutzen, ohne implements zu verwenden. Nozar Delassaei Marvi / HAW Hamburg 22 Weitere Anwendungen von Interfaces 2. Implementierung von Flags //Einige Interfaces definieren weder Methoden noch Konstanten. Sie stellen statt dessen eine Art Flag, also einen logischen Schalter dar, der zur Compileund Laufzeit abgefragt werden kann. Æ Beispiel: Interface Cloneable //Cloneable ist ein Schalter für die in der Klasse Object implementierte Methode clone. ÆImplementiert eine abgeleitete Klasse dieses Interface nicht, so deutet clone das als fehlende Fähigkeit (oder Bereitschaft) der Klasse, eine Objektkopie herzustellen, und löst beim Aufruf eine CloneNotSupportedException aus. Æ Implementiert die abgeleitete Klasse dagegen Cloneable, erzeugt ein Aufruf von clone eine elementweise Kopie des aktuellen Objekts. Nozar Delassaei Marvi / HAW Hamburg 23 Weitere Anwendungen von Interfaces 3. Nachbildung von Funktionszeigern // Eine wichtige Anwendung von Interfaces besteht darin, eine Funktion als Argument an andere Funktionen zu übergeben. Æ Beispiele für ihre Anwendung sind Funktionsplotter oder CallbackFunktionen bei der Programmierung grafischer Oberflächen. // Funktionszeiger können leicht mit Hilfe von Interfaces nachgebildet werden. Dazu wird zunächst ein Interface definiert, das eine einzelne Methode f des gewünschten Typs deklariert. Es kann dann von unterschiedlichen Klassen so implementiert werden, dass in f jeweils die gewünschte Berechnung ausgeführt wird. Anstelle der Übergabe eines Zeigers wird nun einfach ein Objekt dieser Klasse instanziert und an die zu konfigurierende Methode übergeben. Diese wird vom Typ des Interfaces deklariert und kann so die Methode f aufrufen. (Beispiel 0915) Nozar Delassaei Marvi / HAW Hamburg 24 Interfaces und Hilfsklassen 1. Die Default-Implementierung // Es gibt viele Gemeinsamkeiten zwischen (abstrakten) Klassen und Interfaces. ÆFür die Verwendung des Interfaces spricht die größere Flexibilität durch die Möglichkeit, in unterschiedlichen Klassenhierarchien verwendet zu werden. ÆFür die Verwendung einer Klasse spricht die Möglichkeit, bereits ausformulierbare Teile der Implementation zu realisieren und die Fähigkeit, statische Bestandteile und Konstruktoren unterzubringen. // Wird ein Interface erstellt, das voraussichtlich häufig implementiert werden muss und/oder viele Methoden definiert, ist es sinnvoll, eine Default-Implementierung zur Verfügung zu stellen. // Damit ist eine Basisklasse gemeint, die das Interface und alle sinnvoll realisierbaren Methoden implementiert. Besitzt eine Klasse, die das Interface implementieren muss, keine andere Vaterklasse, so kann sie von der Default-Implementierung abgeleitet werden und erbt so bereits einen Teil der sonst manuell zu implementierenden Funktionalität. Nozar Delassaei Marvi / HAW Hamburg 25 Interfaces und Hilfsklassen 2. Delegation an die Default-Implementierung // Läßt sich eine potentielle SimpleTreeNode-Klasse nicht von DefaultTreeNode ableiten, muss sie das Interface selbst implementieren. Besitzt die Default-Implementierung bereits nennenswerte Funktionalitäten, wäre es schlechter Stil, diese ein zweites Mal zu implementieren. Statt dessen ist es eventuell möglich, die Implementierung an die bereits vorhandene DefaultTreeNode zu delegieren. // Dazu muss die zu implementierende Klasse eine Membervariable vom Typ DefaultTreeNode anlegen und alle Aufrufe der InterfaceMethoden an dieses Objekt weiterleiten. Nozar Delassaei Marvi / HAW Hamburg 26 Vielen Dank für Ihre Aufmerksamkeit! Nozar Delassaei Marvi / HAW Hamburg 27