Interface
Ein Interface (engl. Schnittstelle) ist in der objektorientierten Programmierung eine Möglichkeit, für bestimmte Klassen festzulegen, welche Methoden sie aufweisen sollen, ohne diese zu definieren. Wie sie diese Methoden ausdefinieren, obliegt jeder Klasse, die dieses Interface implementiert, selbst.
Im Gegensatz zur abstrakten Klasse können Interfaces nur Methodenköpfe und keine ausprogrammierten Methoden enthalten. Dafür dürfen Klassen auch beliebig viele Interfaces implementieren, während Mehrfachvererbung, also das Erben von mehreren Oberklassen, in vielen Programmiersprachen verboten ist. Die Implementierung von mehreren Interfaces ist deshalb möglich, weil die vorgegebenen Methoden ja sowieso von der Klasse definiert werden müssen und keine Konflikte auftreten können.
Beispiel: Comparable
Ein typisches Interface ist Comparable
. Objekte von Klassen, die Comparable
sind, können in irgendeiner Hinsicht miteinander verglichen und damit z.B. auch sortiert werden. In der Java-API ist zum Beispiel für die Methode Arrays.sort
, mit der Arrays sortiert werden können, festgelegt:
public static void sort(Object[] a)
Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. All elements in the array must implement the
Comparable
interface [eigene Hervorhebung]. Furthermore, all elements in the array must be mutually comparable (that is,e1.compareTo(e2)
must not throw aClassCastException
for any elementse1
ande2
in the array).[1]
Jede Klasse, die dieses Interface implementiert, muss eine Methode namens compareTo
enthalten, die es ermöglicht, die Objekte dieser Klasse mit anderen Objekten zu vergleichen:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
public Person(String first, String last) {
this.firstName = first;
this.lastName = last;
}
public int compareTo(Person other) {
if (this.lastName.equals(other.lastName)) {
return this.firstName.compareTo(other.firstName);
}
return this.lastName.compareTo(other.lastName);
}
}
Ein Array von Person
en könnte nun mit Arrays.sort
sortiert werden.
Das Interface kann nun auch wie ein Datentyp angegeben werden, etwa um Methoden wie diese zu definieren:
public Comparable max(Comparable a, Comparable b) {
if (a.compareTo(b) > 0) {
return a;
}
return b;
}
Dieser Methode ist es völlig gleich, was für Objekte ihr übergeben werden, solange diese das Comparable
-Interface implementieren. Auch über den Rückgabetypen kann nur ausgesagt werden, dass es ein Comparable
ist.
Aufrufe wie new Comparable()
sind hingegen nicht zulässig, da Interfaces nicht instanziiert werden können.