Ein Interface (Schnittstelle) definiert einen abstrakten Datentyp, indem es die Methoden angibt, die auf diesen Datentyp anwendbar sind. Die Methoden sind jedoch im Interface noch nicht implementiert. Sie werden erst in einer Klasse implementiert, die von diesem Interface abgeleitet ist, oder wie man sagt, die dieses Interface implementiert.
Unterschiedliche Klassen, die das Interface implementieren, können diese Methoden durchaus unterschiedlich implementieren. Wichtig ist nur, dass die vom Interface vorgeschriebenen Methoden überhaupt implementiert sind. So ist sichergestellt, dass diese Methoden auf jedes Objekt, das den Datentyp des Interfaces besitzt, angewendet werden können.
Beispiel: Das Interface Sorter schreibt vor, dass jede Klasse, die dieses Interface implementiert, eine Methode sort(int[] a) enthalten muss, also in der Lage sein muss, ein Integer-Array zu sortieren.
Im Interface ist nur der Methodenkopf angegeben. Die Implementierung der Methode erfolgt erst in einer Klasse, die das Interface Sorter implementiert, wie etwa die folgende Klasse InsertionSorter. Dort ist die Methode sort mit der Annotation @Override gekennzeichnet.
In entsprechender Weise lassen sich auch QuickSorter, MergeSorter usw. vom Interface Sorter ableiten.
Der Vorteil einer solchen Lösung mit einem Interface besteht darin, dass alle Sortieralgorithmen, die das Interface Sorter implementieren, als Objekte dieses gemeinsamen Typs ansprechbar sind. Nur so ist es möglich, etwa eine einheitliche Funktion zum Test von Sortierverfahren zu schreiben.
Die Methode testSorter funktioniert so mit jedem Sortierverfahren s vom Typ Sorter, da sichergestellt ist, dass auf s die Methode sort anwendbar ist.
Weiter: [Typ-Parameter] oder [up]