Ein Interface ist eine besondere Form einer Klasse (Schnittstellen-Klasse). Wie in Abschnitt 1.8 beschrieben, kann eine abstrakte Klasse neben konkreten Methoden (mit Methodenkörper) auch abstrakte Methoden (ohne Methodenkörper) besitzen. Ein Interface hingegen kann abstrakte Methoden aber keine konkreten Methoden deklarieren (ein Interface besitzt keine Implementierung). Es wird zwischen zwei unterschiedlichen Interfacedeklarationen unterschieden:
Normale Interfacesdeklaration und Deklaration eines Annotationstyps (siehe dazu
Abschnitt 2). Um eine (normale) Klasse zu deklarieren, wird das
Schlüsselwort InterfaceModifiers_opt interface InterfaceName2 extends InterfaceName1, ..., InterfaceNameN { ... } Interfaces können auch innerhalb von weiteren Interfaces angeordnet sein
und werden als eingebettete oder innere Interfaces bezeichnet. Auch Klassen
können weitere Klassen enthalten (siehe dazu Abschnitt 1.10).
In diesem Abschnitt sollen Top-Level-Interfaces behandelt
werden, die nicht in andere Interfaces eingebettet sind (wenn im folgenden von
Interfaces gesprochen wird, soll von Top-Level-Interfaces ausgegangen werden).
Als Modifiers für Interfaces können Innerhalb des Körpers des Interfaces, also innerhalb des Klammerpaares
"{}", können abstrakte Methoden und Konstanten deklariert werden. Die genannten
Mitglieder des Interfaces werden als implizit Listing 1.36. /* InterfaceExampleA.java */ public interface InterfaceExampleA { public static final double PI = 3.14159; public double circumference(double radius); public double area(double radius); } Im vorausgegangenen Quelltext wurden /* InterfaceExampleA.java */ public interface InterfaceExampleA { double PI = 3.14159; double circumference(double radius); double area(double radius); } Ein weiteres Interface mit dem Namen Listing 1.37. /* InterfaceExampleB.java */ public interface InterfaceExampleB { public double volume(double radius, double height); } Eine Klassendeklaration kann wie in Abschnitt 1.7.2 erläutert
eine KlassenModifiers_opt class KlassenName2 extends KlassenName1 implements InterfaceName1, ..., InterfaceNameN { ... } Einer Klasse, die Interfaces implementiert, wird eine
gewisse Struktur aufgeprägt. Sie ist demnach angehalten die deklarierten
abstrakten Methoden eines Interfaces zu implementieren (Methodenkörper mit
entsprechenden Anweisungen). Eine Klasse ist jedoch nicht
verpflichtet, alle Methoden eines Interfaces zu implementieren. Die Klasse
muss aber in diesem Fall als Listing 1.38. /* InterfaceExample.java */ public class InterfaceExample implements InterfaceExampleA, InterfaceExampleB { public static final double radius = 3.4; public static final double height = 5.0; public double circumference(double r) { double c = 2 * PI * r; return c; } public double area(double r) { double a = r * r * PI; return a; } public double volume(double r, double h) { double v = area(r) * h; return v; } public static void main(String[] args) { InterfaceExample ie = new InterfaceExample(); double c = ie.circumference(radius); double a = ie.area(radius); double v = ie.volume(radius, height); System.out.println("circumference = " + c); System.out.println("area = " + a); System.out.println("volume = " + v); } } Der Quelltext deklariert die zwei Felder circumference = 21.362811999999998 area = 36.31678039999999 volume = 181.58390199999997 Das Interface /* InterfaceExampleB.java */ public interface InterfaceExampleB extends InterfaceExampleA{ public double volume(double radius, double height); } Eine Mehrfachimplementierung wie in Listing 1.38
wäre dann nicht nötig. Das durch Erweiterung entstandene Interface verlangt
von der Klasse /* InterfaceExample.java */ public class InterfaceExample implements InterfaceExampleB { ... }
Verwenden eines Interfacetyps Durch eine Interfacedeklaration entsteht ein neuer Referenztyp
(Interfacetyp). Dir durch Listing 1.36 und
Listing 1.37 definierten Interfaces führen zu den
beiden neuen Interfacetypen InterfaceExample ie = new InterfaceExample(); InterfaceExampleA iea = new InterfaceExample(); InterfaceExampleB ieb = new InterfaceExample(); Den Variablen if (iea instanceof InterfaceExample) { ... }
Interface als Konstantensammlung Das Listing 1.36 enthält die Deklaration einer Konstanten und zwei Methoden. Es ist auch erlaubt, dass innerhalb eines Interfacekörpers ausschließlich Konstanten enthalten sind. Benötigen z.B. mehrere Klassen bestimmte Konstanen, kann ein Interface speziell zur Aufnahme dieser Konstanten erstellt werden. Die entsprechenden Klassen können nun dieses spezielle Interface implementieren und damit stehen ihnen alle Konstanten direkt zur Verfügung. |
|