Sowohl als auch. Real existierende Objekte können in der Regel unter mehreren Aspekten betrachtet werden.
In der objektorientierten Programmierung definieren wir Objekte, die real existierende Objekte nachahmen. Das macht Programme verständlicher und verlässlicher. In der realen Welt betrachten wir Objekte oft auf verschiedene Weise. Wir können unser Auto als Fahrzeug betrachten oder als steuerpflichtiges Eigentum. Es wäre praktisch, wenn Software-Objekte ebenfalls unter mehreren Aspekten betrachtet werden könnten. Aber, ein Java-Objekt gehört genau zu einer Klasse.
In Java wird eine Schnittstelle verwendet, um andere Aspekte auszudrücken als die von der Superklasse geerbten. Eine Schnittstelle ist ein Satz von Anforderungen den eine Klasse implementieren muss.
Eine Schnittstelle ist eine Sammlung von Konstanten und Methodendeklarationen. Die Methodendeklarationen enthalten keine Implementierung (es gibt keinen Methodenkörper.) Eine Klasse, die eine Schnittstelle implementiert, muss jede der in der Schnittstelle gelisteten Methoden implementieren.
Eine Klasse kann eine Superklasse erweitern, um Methoden und Instanzvariablen dieser Superklasse zu erben. Eine Klasse kann ebenso eine Schnittstelle implementieren, um zusätzliche Methoden und Konstanten zu erhalten. Aber, die Methoden der Schnittstelle müssen explizit als Teil der Klassedefinition geschrieben werden. Eine Schnittstelle ist eine Liste von Anforderungen, die eine Klassendefinition explizit einlösen muss (durch Code nicht durch Vererbung).
Zum Beispiel, eine Klasse Auto
erweitert die Klasse Fahrzeug
. Dann erbt Auto
durch Vererbung alle Instanzmethoden und Instanzvariablen der Klasse Fahrzeug
. Wenn die Klasse Auto
auch die Schnittstelle Besteuerbar
implementiert, dann muss die Klassendefinition von Auto
für alle Methoden, die in Besteuerbar
gelistet sind, Code bereitstellen.
Wichtiger Hinweis: Das oben stehende, wie auch die folgenden Seiten dieses Kapitels beschreiben das ursprüngliche Konzept von Schnittstellen in Java, wie es bis zur Version 7 verwendet wurde. Mit den Java Versionen 8 und 9 wurde dieses Konzept grundlegend geändert. Ab der Version 8 können Schnittstellen static und non-static Methoden (mit Methodenkörper) enthalten, die von Klassen, die die Schnittstelle implementieren, geerbt werden. Ab der Version 9 können Schnittstellen auch konkrete private Methoden static und non-static enthalten.
Kann eine Schnittstelle Instanzvariablen enthalten?