Java 8 – Interface-Methoden

Default-Methoden und statische Methoden in Interfaces

Seit Java 8 können Interfaces Methodenimplementierungen enthalten, die an die abgeleiteten Klassen vererbt werden. Damit muss übergeordnete Funktionalität nicht mehr möglichst weit oben in Klassen implementiert werden, sondern sie kann noch höher in Interfaces platziert werden.

Default-Methoden

Die Implementierung einer Default-Methode in einem Interface wird an alle abgeleiteten Interfaces und Klassen vererbt, sofern diese sie nicht mit einer eigenen Implementierung überschreiben. Ein prominentes Beispiel ist die neue forEach-Methode des Iterable-Interface, durch die alle Collections automatisch eine vorgefertige Implementierung bekommen.

Bisher war es so, dass bei Erweiterung eines bestehenden Interfaces um eine neue Methode alle abgeleiteten Klassen diese implementieren mussten, um übersetzbar zu bleiben. Wenn ein Entwickler nicht die Möglichkeit hatte, alle abgeleiteten Klassen anzupassen, war die Erweiterung eines Interfaces sehr problematisch oder sogar unmöglich. Mit einer Default-Methode kann der Entwickler eine Standard-Implementierung bereitstellen, so dass abgeleitete Klassen nicht mehr gezwungen sind, die neue Methode zu implementieren. Sie können sie aber natürlich überschreiben.

Eine Default-Methode beginnt mit dem Schlüsselwort default:

In Interfaces können weiterhin keine nicht statischen, nicht finalen Felder definiert werden. Das bedeutet, dass auch für die Implementierung von Default-Methoden keine Felder definiert werden können. Sie können nur andere Interface-Methoden verwenden.

Wenn eine Klasse mehrere Interfaces implementiert, die Default-Methoden besitzen, kommt es zur lange geächteten Mehrfachvererbung von Funktionalität. Wenn Methodenimplementierungen mit der gleichen Signatur in übergeordneten Interfaces oder Klassen existieren, ist festgelegt, welche Methode tatsächlich vererbt wird:

  • Superklasse hat Vorrang vor Interface
  • näheres Interface hat Vorrang vor entferntem Interface (entfernt = weiter weg in der Vererbungshierarchie)
  • gleich weit entfernte Interfaces -> Kompilierfehler

Wenn eine Klasse direkt zwei Interfaces mit den gleichen Default-Methoden implementiert, kann der Compiler nicht automatisch herleiten, welche Methode vererbt werden soll. Dafür kann der Entwickler angeben, wessen Methode er nutzen will:

Statische Methoden

Interfaces können ab Java 8 statische Methoden enthalten. Sie werden nicht an abgeleitete Klassen vererbt. Ein Aufruf ist also nur mit dem Interface-Namen möglich.

Statische Methoden können beispielsweise Hilfsmethoden zum Umgang mit dem Interface sein, bei denen ein Überschreiben keinen Sinn macht.

Quelle: Java Magazin 2 | 2014

Verfasst von Marion Wilker am 27. April 2017