In der Regel deklariert eine Schnittstelle Operationen, also abstrakte Objektmethoden, die eine Klasse später implementieren muss. Die in Klassen implementiere Schnittstellenmethode kann später wieder überschrieben werden, nimmt also ganz normal an der dynamischen Bindung teil. Einen Objektzustand kann die Schnittstelle nicht deklarieren, denn Objektvariablen sind in Schnittstellen tabu – jede deklarierte Variable ist automatisch statisch, also eine Klassenvariable.
Ab Java 8 lassen sich in Schnittstellen statische Methoden unterbringen und als Utility-Methoden neben Konstanten stellen. Als statische Methoden werden sie nicht dynamisch gebunden und der Aufruf ist ausschließlich über den Namen der Schnittstelle möglich. (Bei statischen Methoden von Klassen ist im Prinzip auch der Zugriff über eine Referenz erlaubt, wenn auch unerwünscht.)
Beispiel:
interface Buyable {
int MAX_PRICE = 10_000_000;
static boolean isValidPrice( double price ) { return price >= 0 && price < MAX_PRICE; }
double price();
}
Von außen ist dann der Aufruf Buyable.isValidPrice(123) möglich.
Alle deklarieren Eigenschaften sind immer implizit public, sodass dieser Sichtbarkeitsmodifizierer redundant ist.
Fassen wir die erlaubten Eigenschaften einer Schnittstelle zusammen:
Attribut |
Methode |
|
Objekt- |
Nein, nicht erlaubt |
Ja, üblicherweise abstrakt |
Statische(s) |
Ja, als Konstante |
Ja, immer mit Implementierung |
Erlaubte Eigenschaften einer Schnittstelle
Design: Eine Schnittstelle mit nur statischen Methoden ist ein Zeichen für ein Designproblem und sollte durch eine finale Klasse mit privaten Konstruktor ersetzt werden. Schnittstellen sind immer als Vorgaben zum Implementieren gedacht und wenn nur statische Methoden vorgekommen, erfüllt die Schnittstelle nicht ihren Zweck, dass sie Vorgaben macht, die unterschiedlich umgesetzt werden können.