Was sind Interfaces und warum braucht Java diese?

4 Antworten

Interfaces dienen dazu, Typen nach Eigenschaften gruppierbar zu machen.

Bsp.:

Ein Interface IFeedable könnte Objekte beschreiben, welche über eine Methode feed verfügen. Folglich kann man dann Variablen anlegen, die Typen mit dieser Eigenschaft aufnehmen können (s. dazu Polymorphie):

IFeedable[] feedableAnimals = new IFeedable[2];
feedableAnimals[0] = new Cat();
feedableAnimals[1] = new Dog();

for (IFeedable feedableAnimal : feedableAnimals) {
   feedableAnimal.feed();
}

Ein Interface legt also fest, was ein Typ, der dieses implementiert, an Eigenschaften / Methoden besitzen muss.

interface IFeedable {
   void feed();
}

class Cat implements IFeedable {
   @Override
   public void feed() { // needs to be public
      // ...
   }
}

Wie die konkrete Implementierung der Methode aussieht, ist natürlich dem Typ selbst überlassen. Somit stellen Interfaces eine Abstraktion eines Typs dar, so wie es auch abstrakte Klassen tun.

Zu beachten ist: Wenn man eine Referenz vom Typ eines Interfaces hat, ist diesem nur das bekannt, was vom Interface definiert wurde:

class Dog implements IFeedable {
   public void bark() {
     // ...
   }

@Override public void feed() { // ... } }
// main: IFeedable animal = new Dog(); animal.bark(); // unknown method for interface
if (animal instanceof Dog) { Dog dog = (Dog) animal; // typecast is necessary dog.bark(); }

regex9  08.12.2017, 05:54

Zusatz:

Durch Interfaces werden außerdem übliche Konzepte der OOP umgesetzt: Das Verbergen von - für den Aufrufer - unwichtigen Informationen und die Möglichkeit, Implementierungen wartbar zu halten, da zwischen verschiedenen konkreten Implementationen flexibel getauscht werden kann.

Beispiel für Data Hiding:

Eine Server-Client-Architektur wird implementiert, d.h. du hast zwei unterschiedliche Anwendungen, die miteinander kommunizieren sollen. Nun wäre es natürlich hilfreich für die Client-Anwendung, wenn sie wüsste, was der Server denn kann. Dazu wird in beiden Anwendungen ein Interface implementiert, welches die selben Methoden definiert. Siehe das RMI-Beispiel aus der Oracle-Dokumentation (komplett: https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/hello/hello-world.html), der Server implementiert das Interface Hello:

https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/hello/Server.java

Dem Client hingegen ist wie gesagt nur das Interface bekannt, aber nicht, wie der Server konkret implementiert wurde (welche Methoden es noch gibt, etc). Das kann ihm aber auch egal sein, er braucht nur die Information, dass es da eine Methode sayHello gibt, die er sicher ausführen kann. Würde es dieses Interface nicht geben, müsste er den kompletten Server-Code auf seiner Seite ebenso implementieren, das wäre unnötiger Code und Ballast (wer weiß, was an so einer Server-Anwendung noch alles anhängen würde?). Zusätzlich würde es die Anwendung unflexibel und unsicher machen (der Client muss nicht wissen, wie die Verbindung zu einer Datenbank hergestellt wird o.ä..).

Beispiel für Flexibilität / Wartbarkeit:

Eine Methode zum Sortieren eines String-Arrays. Mithilfe von Polymorphie wird das 2. Argument (ein Objekt, welches bestimmt, wie die Strings verglichen werden sollen - nach Alphabet, Zahlen zuerst / zuletzt, ...) erst bei Aufruf der Methode bestimmt. Das heißt, die Methode ist flexibel, bei jedem Aufruf kann sie sich anders verhalten.

void sort(String[] liste, IComparer comparer) { /* ... */ }
0

In einigen Programmiersprachen, die keine Mehrfachvererbung unterstützen (wie z. B. Java), können Schnittstellen verwendet werden, um Kompatibilitäten zwischen Klassen zu definieren, die nicht voneinander erben: Die Schnittstellenbeziehungen sind nicht an den strengen Klassenbaum gebunden. Dazu werden Schnittstellendeklarationen häufig explizit als solche markiert (etwa mit dem Schlüsselwort interface). Als Ersatz für Mehrfachvererbung eignen sich Schnittstellen allerdings nicht, da sie lediglich Methoden und deren Parameter definieren und keine Vererbung von Funktionalität ermöglichen

Auszug aus Wiki.

Ich pers. Habe Interfaces nie produktiv eingesetzt.

m.M.n. sind sie sinnvoll wenn mehere an einem Programm arbeiten 

Stell dir vor, dass du ein bestimmtes Ergebnis mit bestimmten Vorbedingungen erzeugen möchtest, aber dich noch nicht festlegen möchtest WIE du das Ergebnis aus den Vorbedingungen produzierst.

Ein Vorteil (von vielen anderen) ist, dass du mit anderen Entwicklern nur die Vorbedingungen und das Ergebnis besprechen musst. Damit können andere Entwickler schon einmal weiterarbeiten, während du dir überlegen kannst, WIE du das Ergebnis erzeugst.

Interfaces sind ledigleich eine Menge von Definitionen von Ergebnissen, die aus bestimmten Vorbedingungen erzeugt werden müssen, ohne sich darauf festzulegen, WIE das geschieht.

Mittels Interfaces kann man Methoden angeben, welche allerdings noch keinen Inhalt (Methodenrumpf) haben. Im Endeffekt ist es also eine Liste aus abstrakten Methoden.

https://www.java-tutorial.org/interfaces.html

So kannste vorgeben, welche Methoden bei der Benutzung eines Interfaces umbedingt vorhanden sein müssen.

Warum kann man stattdessen keine abstrakte Klasse verwenden. Weil man nur einmal extenden kann, aber mWn beliebig viele Interfaces implementieren kann.