Java Tutorial #36

Was ist ein Interface in Java?

2019-07-11 | ©Ociacia/ shutterstock

Overview

In Java ist die Mehrfachvererbung nicht erlaubt. Doch aus dieser scheinbaren Schwäche gewinnt unsere Lieblingsprogrammiersprache eine ihrer größten Stärken. Mit Interfaces nämlich umschiffen wir die Regel der Einfachvererbung elegant und erkunden neue Möglichkeiten, hoch flexiblen Code zu schreiben.

Wozu braucht man Interfaces?

Das Problem

Wissen Sie, was ein Cyborg ist? Laut Wikipedia bezeichnet der Begriff Mischwesen aus lebendigem Organismus und Maschine. 

Übertragen wir die Beziehung zwischen Mensch, Maschine und Cyborg in die Objektorientierung, könnte sich folgende Klassenhierarchie ergeben:

Infografik Java Interface

Die Klasse Cyborg braucht Eigenschaften und Methoden von Mensch und von Maschine und würde daher gleichzeitig von Mensch und Maschine erben. Doch da gibt es ein Problem: 

  • Mehrfachvererbung ist in Java nicht erlaubt

Könnte Java (wie etwa C++) Mehrfachvererbung, würde das unsere Programme unnötig verkomplizieren: Stellen Sie sich einfach mal vor, dass sowohl Mensch als auch Maschine eine Methode namens laufen() haben. Wenn nun Cyborg von beiden Klassen die Methode erben würde, hätten wir ein fettes Dilemma, da es völlig unklar wäre, welche laufen()-Methode auf einem Cyborg-Objekt ausgeführt werden sollte. 

Da eine Java-Klasse also nur von maximal einer anderen Klasse erben kann, bleibt die Frage weiter offen, wie wir unseren Cyborg hinbekommen. 

Die Lösung: Interfaces!

Mit Interfaces (Schnittstellen) lösen wir in Java das Problem der Einfachvererbung und ermöglichen, dass eine Klasse auf mehrere Typen zurückgeht. Eine Klasse kann neben der Oberklasse auf eine beliebige Anzahl an Interfaces zurückgehen - wir sagen dann, dass eine Klasse ein Interface implementiert.

Infografik Java Interface

Die Klasse Cyborg erweitert die Klasse Mensch und implementiert das Interface Maschine. 

Eine Oberklasse zu erweitern und ein Interface zu implementieren sind zwei unterschiedliche Vorgänge. Dies kommt auch in unterschiedlichen Schlüsselwörtern (extends und implements) zum Ausdruck:

public class Cyborg extends Mensch implements Maschine{
    //
}

Wenn eine Klasse sowohl erbt als auch ein Interface implementiert, muss extends immer vor implements stehen. 

Mehrere implementierte Interfaces werden im Klassenkopf kommasepariert geschrieben.

Der Aufbau eines Interfaces

Interfaces sind keine Klassen, ähneln diesen aber im Aufbau. Der folgende Code zeigt den Interface-Typ Maschine:

interface Maschine {

    void ladeBatterie();
    void toolsTesten();
    boolean funktionsfaehig();

}

Anhand von Maschine können wir die verpflichtenden Eigenschaften eines Interface schon erkennen: 

  • Die Zugriffsstufe eines Interfaces ist immer publicDeshalb kann der Zugriffsmodifikator weggelassen werden.
  • Anstatt des Schlüsselworts class wird interface verwendet. 
  • Es gibt keinen Konstruktor (Interfaces sind keine Klassen, also werden sie auch nicht instanziiert).
  • Alle Methoden in einem Interface sind abstrakt. Es darf keine einzige konkrete Methode geben. Deshalb ist das Schlüsselwort abstract nicht nötig.
  • Die Interface-Methoden sind automatisch öffentlich sichtbar. Es darf keine andere Zugriffsstufe gewählt werden. Darum muss das Schlüsselwort publicnicht explizit aufgeführt werden

Wir müssen uns merken: Der fehlende Access-Modifier meint nicht, dass die Methoden default-Zugriff hätten, sondern dass sie "automatisch" public sind. 

Ein Interface ist wie eine 100%-ige abstrakte Klasse. Wenn eine Klasse nicht alle Methoden der Interfaces implementiert (d.h. Methodenkörper liefert), so erbt sie damit abstrakte Methoden. Die Klasse muss dann wiederum selbst als abstractgekennzeichnet werden. 

In unserem Fall heißt das: Entweder die Klasse Cyborg macht durch Implementierung alle drei Methoden ladeBatterie()toolsTesten() und funktionsfaehig() konkret oder sie muss selbst als abstrakt deklariert werden.

Variablen in Interfaces

Da von Interfaces keine Instanzen (Objekte) erzeugt werden können, gibt es auch keine Instanzvariablen. 

Konstanten allerdings sind kein Problem. Zum Beispiel:

public static final double maxEnergie = 100.0;

Da in Interfaces ausschließlich öffentliche Konstanten-Variablen erlaubt sind, müssen die Schlüsselwörter publicstatic und final nicht explizit genannt werden (auch wenn es natürlich trotzdem möglich ist). Der Compiler ergänzt die fehlenden Angaben für uns. 

Ergänzen wir unser Interface Maschine nun um die Konstante maxEnergie:

interface Maschine {

    double maxEnergie = 100.0; // = public static final

    void ladeBatterie();
    void toolsTesten();
    boolean funktionsfaehig();

}

Interfaces und Polymorphie

Interfaces sind super, um in Java doch noch eine Art Mehrfachvererbung hinzubekommen. Aber Sie haben noch einen zweiten großen Vorteil

Wenn unsere Klassen ein Interface implementieren, spielen sie eine "Rolle" und es ist dabei völlig schnuppe, aus welchem Vererbungsbaum sie kommen:

Infografik Java Interface und Polymorphie

Cyborg und Cyberdog haben keine gemeinsame Vererbungsstruktur. Da sie aber das Interface Maschine implementieren, können sie beide die Rolle Maschine spielen: Sowohl der Cyborg (Mensch) als auch der Cyberdog (Hund) sind Maschinen

Diese Tatsache hat einen riesigen Nutzen: Da ein Interface - genau wie eine Klasse - einen Typ definiert, können wir Referenzvariablen oder Sammlungen von einem Interface-Typ deklarieren. Damit können wir die Prinzipien der Polymorphie nach allen Regeln der Kunst voll ausreizen und unseren Code unwiderstehlich machen. 

Hier ein Beispiel: 

ArrayList<Maschine> maschinen = new ArrayList<>();
maschinen.add(new Cyborg());
maschinen.add(new Cyberdog());
maschinen.add(new Waschmaschine());

Wir erstellen eine ArrayList, die alle Typen aufnehmen kann, die das Interface Maschine implementieren. Anschließend packen wir drei passende neue anonyme Objekte rein. 

CyborgCyberdog und jetzt sogar Waschmaschine entstammen ganz unterschiedlichen Vererbungsstrukturen. Aber sie haben alle neben ihres vererbten Typs zusätzlich den Interface-Typ Maschine. Mit anderen Worten: Es sind Maschinen; und das ist ihre Gemeinsamkeit. 

Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen