Schnittstellendeklarationen in Java
Man kann keine Objekte einer Schnittstelle (getClass) anlegen, sondern nur Exemplare dieser Schnittstelle (instanceof).
Alle Methoden einer Schnittstelle sind public. Daher ist die Angabe »public« vor einer Methodendeklaration in einer Schnittstelle überflüssig. Sie kann aber bequem sein, weil die Deklaration der abstrakten Methode dann kopiert werden kann, wenn jemand eine Implementation diese Methode schreiben will, die ja mit »public« beginnen muß.
Die Methodendeklarationen einer Schnittstelle haben an Stelle des Rumpfs ein Semikolon. Sie werden daher auch als abstrakte Methoden bezeichnet.
Die final-Festlegung für einen Parameter ist kein Teil der Schnittstelle einer Methode und muß daher auch nicht in der Schnittstellendeklaration wiederholt werden.
Mit der Annotation »@java.lang.Override« wird erklärt, daß eine Methode ein Methodenbeschreibung aus einer Schnittstelle implementieren soll.
Main.java
interface Alpha
{ void writeln( int a ); }interface Beta
{ public void writeln( final int a ); }class Alpha0 implements Alpha, Beta
{ @java.lang.Override public void writeln( final int a )
{ java.lang.System.out.println( a ); }}public final class Main
{ public static void main( final java.lang.String[] args )
{ final Alpha alpha = new Alpha0();
java.lang.System.out.println( alpha.getClass() );
java.lang.System.out.println( alpha instanceof Alpha );
alpha.writeln( 2 ); }}transcript
class Alpha0
true
2
Eine Schnittstelle kann zwar auch statische Methoden enthalten, aber diese gehören zur der Schnittstelle, wenn sie als Typ von Ausdrücken oder hinter »implements« verwendet wird. Eine Schnittstelle kann also keinen Vorgaben für statische Methoden einer sie implementierenden Klasse machen.
Konstanten in Schnittstellen
Konstanten in Schnittstellen sind erlaubt, auch wenn sie nicht abstrakt sind. Sie werden meist groß geschrieben.
Main.java
interface Alpha
{ public final int PI = 3; }public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( Alpha.PI ); }}transcript
3
Konstanten von Schnittstellen werden von der JLS auch so bezeichnet (JLS8, 9.3 Field (Constant) Declarations).
Fehlimplementation in Schnittstellen
Eine Fehlimplementation einer Schnittstelle wird mit »default« gekennzeichnet und übernommen, falls sie nicht von einer implementierenden Klasse ersetzt wird.
Main.java
interface Alpha
{ default void writeln( final int a )
{ java.lang.System.out.println( a ); }}class Alpha0 implements Alpha
{ }public final class Main
{ public static void main( final java.lang.String[] args )
{ final Alpha alpha = new Alpha0();
java.lang.System.out.println( alpha.getClass() );
java.lang.System.out.println( alpha instanceof Alpha );
alpha.writeln( 4 ); }}transcript
class Alpha0
true
4
Statische Methoden in Schnittstellen
Schnittstellendeklarationen können auch Deklarationen statischer Methoden enthalten. Diese werden aber nicht Teil der Methoden, welche von einer die Schnittstelle implementierenden Klasse implementiert werden müssen. Sie gehören sozusagen nicht zur „Schnittstelle der Schnittstelle“, die nur aus nicht-statischen abstrakten Methoden besteht.
Übungsaufgaben
Schreiben Sie zu dem folgenden Programm eine Schnittstellendeklaration mit möglichst wenigen abstrakten Methoden, so daß das Programm wie gezeigt läuft.
Main.java
/* Hier die Schnittstellendeklaration einfügen */
class Writer implements Smallest
{ public void write( final int a )
{ java.lang.System.out.print( a ); }public void writeln( final int a )
{ java.lang.System.out.println( a ); }}public final class Main
{ public static void main( final java.lang.String[] args )
{ final Smallest smallest = new Writer();
writer.writeln( 4 ); }}transcript
4
Schreiben Sie zu dem folgenden Programm eine Schnittstellendeklaration mit möglichst vielen abstrakten Methoden, so daß das Programm wie gezeigt läuft.
Main.java
/* Hier die Schnittstellendeklaration einfügen */
class Console implements Largest
{ public void write( final int a )
{ java.lang.System.out.print( a ); }public void writeln( final int a )
{ java.lang.System.out.println( a ); }}class Writer implements Largest
{ public void write( final int a )
{ java.lang.System.out.print( a ); }public void writeQuoted( final int a )
{ java.lang.System.out.println( "'" + a + "'" ); }}public final class Main
{ public static void main( final java.lang.String[] args )
{ final Writer writer = new Writer();
writer.writeQuoted( 2 ); }}transcript
'2'
Markierungsschnittstellen
Zur Markierung von Klassen kann eine Markierungsschnittstelle (tagging interface ) verwendet werden. Hierbei handelt es sich um eine Schnittstelle, die gar keine Einträge zu enthalten braucht, aber alle Klassen, die sie implementieren, in einer Weise kennzeichnet, die mit dem Operator "instanceof" ermittelt werden kann. So könnte ein Programmierer alle seine Klassen durch die Markierungsschnittstelle "I" kennzeichnet. Dann kann bei Bedarf mit dem Ausdrucksteil "instanceof I" ermittelt werden, ob eine Klasse von diesem Programmierer stammt.
Die Markierung kann auch indirekt dadurch erfolgen, daß eine Schnittstelle implementiert wird, welche die Markierungsschnittstelle erweitert. So ist in dem Programmbeispiel "Tagging.java" die Klasse "A" direkt und die Klasse "B" indirekt mit der Markierungsschnittstelle "I" gekennzeichnet.
Tagging.java
public final class Tagging { public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( new A() instanceof I );
java.lang.System.out.println( new B() instanceof I );
java.lang.System.out.println( new C() instanceof I ); }}
class A implements I {}
class B implements J {}
class C {}
interface J extends I {}
interface I {}System.out
true
true
false