6999 Views 5

credit: ©monsitj/ stock.adobe

Java Blog

default-Methoden in Java Interfaces

Ein Interface darf nur abstrakte Methoden haben? Seit Java 8 gilt diese Regel nicht mehr! Mit der default-Methode ist es nun auch möglich, spezielle konkrete Methoden in Interfaces zu programmieren.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Schnelles Code-Beispiel

interface Inter1 {

    // default Methode
    default void methode1(){
        System.out.println("Ich bin sowas von konkret!");
    }

}

default Methoden in Java

Das Problem

Vor Java 8 gab es in Interfaces ausschließlich abstrakte Methoden (Ausahme siehe ganz unten). Die Subklassen lieferten dann die notwendige Ausprogrammierung der abstrakten Methoden.

Es kam vor, dass wir unseren Interfaces nachträglich neue Methoden hinzugefügt haben. Das konnte manchmal sehr umständliche Folgen haben: Stellen Sie sich nur mal vor, eine große Anzahl an Klassen (verschiedener Vererbungsbäume) implementiert ein Interface, das nun eine neue Methode erhält. Unser Code war solange nicht mehr kompilierbar, ehe wir die neue Methode überall ausprogrammiert hatten.

Die Lösung

Um diesem Problem Abhilfe zu schaffen, wurde das Konzept der default Methoden erfunden, die es Interfaces nun erlauben, auch konkrete Methoden zu besitzen. Das Hinzufügen einer solchen Methode hätte dann keine Auswirkungen auf die Klassen, die das Interface implementieren.

Um eine default Methode einzusetzen, verwenden wir das Keyword default im Methodenkopf:

interface Inter1 {

    // abstrakte Methode
    void methode1();

    // default Methode
    default void methode1(){
        System.out.println("Konkrete Methode ausgeführt");
    }

}

In einem Interface sind prinzipiell alle Methoden öffentlich. Dies gilt auch für die default Methode. Wir können den Zugriffsmodifikator public darum einfach weglassen (Java ergänzt ihn für uns).

Es sind außerdem beliebig viele default-Methoden in einem Interface möglich.

default Methoden mit derselben Signatur

Was geschieht, wenn eine Klasse mehrere Interfaces implementiert, deren default-Methoden eine identische Signatur besitzen? Zum Beispiel:

interface Inter1 {
    default void methode1(){
        System.out.println("Ich bin default von Inter1");
    }
}

interface Inter2 {
    default void methode1(){
        System.out.println("Ich bin default von Inter2");
    }
}

public class Cyborg implements Inter1, Inter2{ // error!

}

Der Code kann so nicht compiliert werden. Der Compiler wird für die Subklasse Cyborg eine Fehlermeldung ausgeben wie: Cyborg inherits unrelated defaults for methode1() from types Inter1 and Inter2.

Die Sache ist logisch: Der Compiler muss für Cyborg zwingend wissen, welche der beiden Methoden angenommen werden soll.

Die einzige Lösung besteht darin, die "doppelte" Methode in der Subklasse zu überschreiben:

public class Cyborg implements Inter1, Inter2{
    @Override
    public void methode2(){
    System.out.println("Überschriebene default-Methode");
    }
}

Nicht vergessen: Wir müssen für ein korrektes Überschreiben von methode1() in der Klasse Cyborg den Zugriffsmodifikator explizit auf public setzen.

default Methode vs. statische Methoden

Ein Interface musste auch schon vor Java 8 nicht 100% abstrakt sein. Statische Methoden nämlich waren in Interfaces stets einsetzbar. Sie sind konkret, d.h. sie haben mit ihrem Methodenkörper eine Implementierung. Anders als die default-Methode werden statische Member aber nicht vererbt und sind beim Ausführen nicht an ein Objekt, sondern an die Klasse gebunden.

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

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