/
/
·
·
/
/
·
·
  • Einführung
  • Die Idee in einem Satz
  • Beispiel: ohne vs. mit Interface
  • Interface deklarieren und implementieren
  • Multi-Implementation: das Killer-Feature
  • Default-Methoden (Java 8+)
  • Private Interface-Methoden (Java 9+)
  • Konstanten in Interfaces
  • Interface vs. Abstrakte Klasse, der ewige Klausur-Klassiker
  • Polymorphie via Interface-Referenz
  • Klausur-Faustregeln
  • Häufige Stolpersteine
  • Klausur-Beispielaufgabe
ThemenProgrammiergrundlagenInterfaces
Programmiergrundlagen·4Lerneinheiten·37min·Stand17.07.2026

Interfaces.

Ein Interface ist ein Vertrag. Es legt fest, welche Methoden eine Klasse anbieten muss, ohne vorzuschreiben, wie sie umgesetzt werden. Wie ein Stecker-Standard (USB-C): egal welches Gerät dahintersteckt, es muss exakt dieselben Pins in derselben Anordnung haben, sonst passt der Stecker nicht. Das Wie (was im Gerät passiert) ist offen, das Was (die Form des Steckers, also die Schnittstelle) ist fest. Genauso können in Java Auto und Fahrrad beide das Interface Fahrbar implementieren, obwohl sie keine gemeinsame Oberklasse brauchen, jeder fährt nur auf seine Weise.

Wozu brauchst du das? Ein Interface ist in Java der Schlüssel zu loser Kopplung (Code hängt am Vertrag, nicht an einer konkreten Klasse) und zu Mehrfach-Vererbung von Typ/Vertrag (mit extends ist mehr als eine Oberklasse verboten, mit implements darf eine Klasse beliebig viele Interfaces erfüllen). Wichtig zur Abgrenzung: gemeint ist Mehrfachvererbung von Typ/Vertrag, nicht von Feldern oder Klassen-Implementierung, ein Interface vererbt keinen Zustand und keinen geteilten Konstruktor-Code. Klassisch enthält ein Interface nur Signaturen ohne Code, seit Java 8 dürfen Interfaces aber auch default-Methoden mit fertiger Implementierung mitbringen. Klausur-Klassiker: Interface vs. abstrakte Klasse, Multi-Implementation, Polymorphie über Interface-Referenzen.

Interface: Definiert WAS eine Klasse können muss (Methoden-Signaturen), nicht WIE sie es macht (keine Implementierung).

interface Sortierbar {
    int compareTo(Sortierbar other);
}

Wer Sortierbar implementieren will, MUSS compareTo anbieten. Wie genau sortiert wird (nach Name, Note, Matrikelnummer), ist Sache der Klasse.

Visuell sieht die implements-Beziehung in UML so aus (gestrichelte Linie + Pfeil = "implementiert"):

        <<interface>>
         Sortierbar
        +compareTo()
              ^
              ¦   gestrichelte Linie = implements
      ........¦........
      ¦               ¦
   Student           Buch
   +compareTo()      +compareTo()

Merkregel fürs Diagramm: gestrichelte Linie = implements (Klasse erfüllt Interface), durchgezogene Linie = extends (Klasse erbt von Klasse). Den interaktiven UML-Visualizer mit allen drei Szenarien findest du weiter unten.

Und damit der wichtigste Klausur-Vergleich sofort sitzt, hier die Kurzfassung (die volle Tabelle kommt später):

InterfaceAbstrakte Klasse
Mehrere möglich?✅ implements A, B❌ nur 1 extends
State (Felder mit Wert)❌ nur Konstanten✅ ja
Konstruktor❌✅

Ohne Interface (rigide Kopplung)

class SortierAlgorithmus {
    void sortiere(Student[] studenten) {
        // ... vergleicht direkt student.note
    }
}

class AnderesSortierAlgorithmus {
    void sortiere(Buch[] buecher) {
        // ... vergleicht direkt buch.titel
    }
}

Für jeden Datentyp eine eigene Sortier-Klasse. Nicht wiederverwendbar.

Mit Interface (flexible Kopplung)

interface Sortierbar {
    int compareTo(Sortierbar other);
}

class Student implements Sortierbar {
    int note;
    public int compareTo(Sortierbar other) {
        return this.note - ((Student) other).note;
    }
}

class Buch implements Sortierbar {
    String titel;
    public int compareTo(Sortierbar other) {
        return this.titel.compareTo(((Buch) other).titel);
    }
}

class Sortierer {
    static void sortiere(Sortierbar[] items) {
        // funktioniert für ALLES, was Sortierbar ist
    }
}

Eine Sortier-Logik, viele sortierbare Klassen. Das ist Polymorphie via Interface.

Praxis-Hinweis (Best Practice): Der Cast ((Student) other) ist hier didaktisch vereinfacht, er kann zur Laufzeit eine ClassCastException werfen, falls other doch kein Student ist. In echtem Code nutzt man das generische Comparable<Student> aus der Java-Standardbibliothek: class Student implements Comparable<Student> mit public int compareTo(Student other). Dann ist der Vergleich typsicher und der Cast entfällt komplett (so empfiehlt es auch Bloch, Effective Java, Item 14). Wir bleiben oben beim ungenerischen Interface, um nur das Prinzip zu zeigen.

interface Fahrzeug {
    void starten();
    void stoppen();
    int getMaxGeschwindigkeit();
}

class Auto implements Fahrzeug {
    public void starten() {
        System.out.println("Motor an");
    }
    public void stoppen() {
        System.out.println("Motor aus");
    }
    public int getMaxGeschwindigkeit() {
        return 200;
    }
}

Pflicht: Alle Methoden des Interfaces müssen implementiert werden. Wenn auch nur eine fehlt → Compile-Error, ausser die Klasse ist abstract.

Java erlaubt Einfach-Vererbung mit extends (max. 1 Oberklasse), aber Mehrfach-Implementierung mit implements:

interface Schwimmen {
    void schwimmen();
}

interface Fliegen {
    void fliegen();
}

class Ente extends Tier implements Schwimmen, Fliegen {
    public void schwimmen() { System.out.println("paddel paddel"); }
    public void fliegen() { System.out.println("flatter flatter"); }
}

Die Ente erbt von Tier und implementiert 2 Interfaces. Das geht mit extends nicht (Diamond-Problem), aber mit Interfaces problemlos.

Seit Java 8 dürfen Interfaces auch Default-Implementierungen anbieten. Damit kannst du Interfaces erweitern, ohne alle bestehenden Implementierer zu brechen:

interface Fahrzeug {
    void starten();

    // Default-Methode mit Implementierung
    default void hupe() {
        System.out.println("Hup hup!");
    }
}

class Auto implements Fahrzeug {
    public void starten() { /*...*/ }
    // hupe() musst du nicht implementieren, wird von Default geerbt
}

Klausur-Falle: Default-Methoden lockern die "nur Vertrag"-Regel. Manche Hochschulen behandeln Interfaces noch klassisch (nur Signaturen), prüfe dein Skript.

Seit Java 9 dürfen Interfaces zusätzlich private Methoden als interne Helfer enthalten. Sie sind dazu da, gemeinsamen Code mehrerer default- oder static-Methoden zu bündeln, ohne ihn nach außen sichtbar zu machen:

interface Logger {
    default void info(String msg)  { log("INFO", msg); }
    default void error(String msg) { log("ERROR", msg); }

    // private Helper, NICHT Teil der öffentlichen API
    private void log(String level, String msg) {
        System.out.println("[" + level + "] " + msg);
    }
}

Wichtig: Private Interface-Methoden gehören nicht zur öffentlichen API, sie können nur innerhalb des Interfaces selbst aufgerufen werden, eine implementierende Klasse sieht sie gar nicht und kann sie nicht überschreiben. Es ist also kein neuer Vertrags-Bestandteil, sondern reine interne Strukturierung der Default-Methoden.

Quelle/Version: Private Interface-Methoden wurden mit Java 9 eingeführt (JEP 213, "Milling Project Coin"). Spezifiziert in der Java Language Specification §9.4 (Methodendeklarationen in Interfaces); eine kompakte Einführung bietet das Oracle-Tutorial-Kapitel zu Default- und privaten Methoden. Da viele Hochschulen noch auf Java 8 oder klassischen Interfaces aufsetzen, prüfe dein Skript, ob dieses Feature klausurrelevant ist.

Felder in Interfaces sind implizit public static final (Konstanten):

interface MathKonstanten {
    double PI = 3.14159;
    double E = 2.71828;
}

class Rechner implements MathKonstanten {
    double umfang(double r) {
        return 2 * PI * r;  // direkter Zugriff
    }
}

In modernen Java-Codes ist das Anti-Pattern (Konstanten gehören in final class-Utility-Klassen oder Enums), aber Klausur kann fragen, was die Sichtbarkeit ist.

Warnung: Nutze Interface-Konstanten sparsam. In Anfängerprojekten werden sie oft als allgemeiner globaler Speicher missbraucht (jede Klasse implementiert das Interface nur, um an die Werte zu kommen). Für zusammengehörige Konstanten ist meist eine finale Utility-Klasse (final class MathKonstanten mit private Konstruktor) oder ein enum sauberer, weil dort der Vertrags-Gedanke des Interfaces nicht verwässert wird.

EigenschaftInterfaceAbstrakte Klasse
Mehrfach-Vererbung✅ (mehrere implements)❌ (nur 1 extends)
Feldernur public static final (Konstanten)beliebige Felder, alle Sichtbarkeiten
Methodenabstrakt, default + static (ab Java 8), private Helper (ab Java 9)abstrakt + konkret + private
Konstruktor❌ verboten✅ erlaubt (für Subklassen)
State (Felder mit Wert)❌ kein State✅ State möglich
Schlüsselwortimplementsextends
Sichtbarkeit Methodenimplizit publicbeliebig
Wann nutzen?Vertrag, lose Kopplung, Multi-Inheritancegemeinsamer Code-Vorrat, Template-Method

Faustregel: Erst Interface versuchen. Nur abstrakte Klasse, wenn du echten Code mehrfach teilen willst (Konstruktor, State, gemeinsame Helper).

Du kannst eine Variable vom Interface-Typ deklarieren und beliebige Implementierer zuweisen:

Fahrzeug f;
f = new Auto();
f.starten();    // ruft Auto.starten()

f = new Motorrad();
f.starten();    // ruft Motorrad.starten()

Java entscheidet erst zur Laufzeit, welche Methode passt, das nennt man dynamische Bindung (oder Late Binding). Welche Methode aufgerufen wird, hängt also am tatsächlichen Objekt-Typ (new ...()), nicht am deklarierten Typ der Variablen. Klausur-Frage Standard: "Welche Methode wird aufgerufen?", Antwort hängt von new ...(), nicht von der Variable.

1. Interface = Vertrag, kein State. Felder sind public static final (Konstanten), keine Instanzvariablen.

2. implements für Interfaces, extends für Klassen. Bei mehreren Interfaces durch Komma trennen: implements A, B, C.

3. Methoden im Interface sind implizit public. Bei der Implementierung MUSST du explizit public schreiben, die Sichtbarkeit darf gegenüber dem Interface nicht eingeschränkt (weniger offen) werden.

4. Default-Methoden sind nicht statisch. Sie werden auf Instanzen aufgerufen wie normale Methoden. Statische Methoden im Interface (static Schlüsselwort) gibts seit Java 8 auch, aber separat.

5. Polymorphie funktioniert über Interface-Referenz. List<Integer> l = new ArrayList<>(); ist Standard-Java-Stil, Variable vom Interface-Typ, Objekt von konkreter Klasse.

1. public bei Implementierung vergessen. (TOP-Falle) Im Interface ist die Methode implizit public. Wenn du in der Klasse void starten() (ohne public) schreibst, ist das package-private, also weniger sichtbar als vom Interface gefordert → Compile-Error (eine Implementierung darf die Sichtbarkeit nie einschränken, nur beibehalten). Das ist der mit Abstand häufigste Klausur-Fehler bei Interfaces.

2. Interface mit new instanziieren. (TOP-Falle) Fahrzeug f = new Fahrzeug(); geht nicht (außer mit anonymer Klasse). Du brauchst eine konkrete Implementierer-Klasse. Diese Falle wird in Klausuren extrem gern als Ankreuz-Distraktor versteckt.

3. Methoden-Signatur abweichen lassen. Wenn das Interface int compareTo(Sortierbar) vorgibt und du int compareTo(Object) schreibst, implementierst du das Interface nicht. Bei Signaturmismatch wird die Methode überladen statt überschrieben.

4. Konstruktoren im Interface erwarten. Interfaces haben keine Konstruktoren. Wenn du Setup brauchst, mach es in der Implementierer-Klasse.

5. Default- und abstract-Methoden mit gleicher Signatur in 2 Interfaces. Bei Multi-Implementation müsstest du selbst überschreiben und entscheiden welche Default-Methode du nehmen willst (Interface.super.methode()).

Beispiel (typischer Klausur-Stil, zur Übung konstruiert).

Gegeben sind ein Interface und zwei Klassen:

interface Zahlbar {
    double betrag();
}

class Rechnung implements Zahlbar {
    private double summe;
    public Rechnung(double summe) { this.summe = summe; }
    public double betrag() { return summe; }
}

abstract class Dokument {
    abstract String titel();
}

(a) Warum ist Zahlbar z = new Zahlbar(); ein Fehler, Zahlbar z = new Rechnung(99.0); aber erlaubt? (b) Die Klasse Mahnung soll sowohl ein Dokument sein als auch Zahlbar. Schreibe den Kopf der Klassendeklaration (nur die erste Zeile, ohne Body). (c) Eine Methode double summe(Zahlbar[] posten) addiert die Beträge aller Elemente. Warum funktioniert sie für ein Array, das Rechnung- und Mahnung-Objekte gemischt enthält? Wie heißt das zugrunde liegende Prinzip?

Lösung:

  • (a) Zahlbar ist ein Interface ohne Implementierung, ein Interface lässt sich nicht direkt mit new instanziieren. new Rechnung(99.0) erzeugt dagegen ein konkretes Objekt; weil Rechnung Zahlbar implementiert, darf die Referenz vom Interface-Typ Zahlbar sein (Polymorphie über Interface-Referenz).
  • (b) class Mahnung extends Dokument implements Zahlbar { , extends (genau eine Klasse) steht immer vor implements (beliebig viele Interfaces).
  • (c) Alle Elemente sind vom statischen Typ Zahlbar und bieten daher garantiert betrag() an. Zur Laufzeit ruft Java über dynamische Bindung die jeweils passende Implementierung (Rechnung.betrag() oder Mahnung.betrag()) auf. Das Prinzip heißt Polymorphie (über eine Interface-Referenz).

3 Szenarien, jedes zeigt das UML-Diagramm + Code parallel:

  1. Einfaches Interface, eine Klasse implementiert ein Interface
  2. Multi-Implementation, eine Klasse implementiert mehrere Interfaces
  3. Interface-Hierarchie, ein Interface erbt von einem anderen via extends

Schalte direkt auf Szenario Multi-Implementation (Ente), dort siehst du auf einen Blick, was implements Schwimmen, Fliegen bedeutet. Beobachte wie sich die Pfeile (gestrichelt = implements, durchgezogen = extends) und der Code ändern.

Lade Visualisierung...

Klausur-Tipp: UML-Diagramme in Java-Klausuren nutzen gestrichelte Pfeile für implements und durchgezogene Pfeile für extends. Wenn du es siehst, weißt du sofort die Beziehung. Frage in der Prüfung: "Welche Methoden muss Ente implementieren?", Antwort: alle abstrakten Methoden aller Interfaces, die sie implementiert + Schwimmen + Fliegen + Tier-Methoden, die nicht in Tier implementiert sind.


Drei Demos zum Durchklicken. Klick Step oder Auto und beobachte, wie sich Variablen, Aufruf-Ziel und Konsole pro Schritt ändern.

1. implements: der Vertrag zwingt zur Implementierung

Auto implementiert Fahrzeug und muss daher jede Interface-Methode mit public ausprogrammieren. Wir verfolgen einen starten()-Aufruf.

Lade Visualisierung...

2. Polymorphie + dynamische Bindung

Dieselbe Variable vom Interface-Typ Fahrzeug zeigt nacheinander auf verschiedene Objekte. Welche starten()-Methode läuft, entscheidet sich erst zur Laufzeit anhand des echten Objekt-Typs, nicht anhand der Variablen-Deklaration.

Lade Visualisierung...

3. Default-Methode: geerbt ohne eigene Implementierung

Seit Java 8 darf ein Interface eine default-Methode mitbringen. Auto implementiert nur starten() selbst, hupe() wird aus dem Interface geerbt, ohne dass die Klasse sie schreibt.

Lade Visualisierung...

Klausur-Tipp: Achte bei Tracing-Aufgaben immer auf den tatsächlichen Typ hinter der Interface-Variablen (new ...()), nicht auf den deklarierten Typ. Genau dort versteckt sich die typische Polymorphie-Frage "Welche Methode wird aufgerufen?".

Anmelden, um den Fortschritt zu speichern.

Nächster Schritt

Wenn du fertig bist: jetzt üben.

Aktives Abrufen festigt Wissen schneller als nochmal lesen.

War das hilfreich?

Verwandte Themen

  • Variablen und Datentypen
  • Bedingungen
  • Schleifen
  • Funktionen
  • Rekursion

Folgt

  • Lambdas & Higher-Order-Funktionen
  • Komposition vs. Vererbung

Tools

Bald: Karteikarten · Spaced-Repetition · Mind-Map-Export

Fachliche Qualität
S-Tier · GoldstandardZuletzt geprüft am 11.06.2026

Diese Lerneinheit wurde für typische Bachelor-Klausuren konzipiert. So prüfen wir · Fehler entdeckt? Melde ihn uns oder markiere die fragliche Stelle direkt im Text oben.

Klausur-ÜbersichtKomplette Übersicht: alle Tabs als linearer Text zum Lernen
▾

Alle Tabs der Lerneinheit (Erklärung · Interaktiv verstehen · Praxis-Übung · Klausur-Quiz) als durchgehender Text. Ideal zum Wiederholen vor der Klausur, und für Suchmaschinen wie Google, Bing und KI-Suche (ChatGPT, Perplexity).

Inhalt dieser Übersicht

  1. Erklärung(Erklärung)
  2. Interaktiv verstehen(Visualisierung / Interaktiv)
  3. Praxis-Übung(Quiz / Klausurfragen)
  4. Klausur-Quiz(Quiz / Klausurfragen)
Teil 1·Erklärung

Erklärung

Ein Interface ist ein Vertrag. Es legt fest, welche Methoden eine Klasse anbieten muss, ohne vorzuschreiben, wie sie umgesetzt werden. Wie ein Stecker-Standard (USB-C): egal welches Gerät dahintersteckt, es muss exakt dieselben Pins in derselben Anordnung haben, sonst passt der Stecker nicht. Das Wie (was im Gerät passiert) ist offen, das Was (die Form des Steckers, also die Schnittstelle) ist fest. Genauso können in Java Auto und Fahrrad beide das Interface Fahrbar implementieren, obwohl sie keine gemeinsame Oberklasse brauchen, jeder fährt nur auf seine Weise.

Wozu brauchst du das? Ein Interface ist in Java der Schlüssel zu loser Kopplung (Code hängt am Vertrag, nicht an einer konkreten Klasse) und zu Mehrfach-Vererbung von Typ/Vertrag (mit extends ist mehr als eine Oberklasse verboten, mit implements darf eine Klasse beliebig viele Interfaces erfüllen). Wichtig zur Abgrenzung: gemeint ist Mehrfachvererbung von Typ/Vertrag, nicht von Feldern oder Klassen-Implementierung, ein Interface vererbt keinen Zustand und keinen geteilten Konstruktor-Code. Klassisch enthält ein Interface nur Signaturen ohne Code, seit Java 8 dürfen Interfaces aber auch default-Methoden mit fertiger Implementierung mitbringen. Klausur-Klassiker: Interface vs. abstrakte Klasse, Multi-Implementation, Polymorphie über Interface-Referenzen.

Die Idee in einem Satz

Interface: Definiert WAS eine Klasse können muss (Methoden-Signaturen), nicht WIE sie es macht (keine Implementierung).

interface Sortierbar {
    int compareTo(Sortierbar other);
}

Wer Sortierbar implementieren will, MUSS compareTo anbieten. Wie genau sortiert wird (nach Name, Note, Matrikelnummer), ist Sache der Klasse.

Visuell sieht die implements-Beziehung in UML so aus (gestrichelte Linie + Pfeil = "implementiert"):

        <<interface>>
         Sortierbar
        +compareTo()
              ^
              ¦   gestrichelte Linie = implements
      ........¦........
      ¦               ¦
   Student           Buch
   +compareTo()      +compareTo()

Merkregel fürs Diagramm: gestrichelte Linie = implements (Klasse erfüllt Interface), durchgezogene Linie = extends (Klasse erbt von Klasse). Den interaktiven UML-Visualizer mit allen drei Szenarien findest du weiter unten.

Und damit der wichtigste Klausur-Vergleich sofort sitzt, hier die Kurzfassung (die volle Tabelle kommt später):

InterfaceAbstrakte Klasse
Mehrere möglich?✅ implements A, B❌ nur 1 extends
State (Felder mit Wert)❌ nur Konstanten✅ ja
Konstruktor❌✅

Beispiel: ohne vs. mit Interface

Ohne Interface (rigide Kopplung)
class SortierAlgorithmus {
    void sortiere(Student[] studenten) {
        // ... vergleicht direkt student.note
    }
}

class AnderesSortierAlgorithmus {
    void sortiere(Buch[] buecher) {
        // ... vergleicht direkt buch.titel
    }
}

Für jeden Datentyp eine eigene Sortier-Klasse. Nicht wiederverwendbar.

Mit Interface (flexible Kopplung)
interface Sortierbar {
    int compareTo(Sortierbar other);
}

class Student implements Sortierbar {
    int note;
    public int compareTo(Sortierbar other) {
        return this.note - ((Student) other).note;
    }
}

class Buch implements Sortierbar {
    String titel;
    public int compareTo(Sortierbar other) {
        return this.titel.compareTo(((Buch) other).titel);
    }
}

class Sortierer {
    static void sortiere(Sortierbar[] items) {
        // funktioniert für ALLES, was Sortierbar ist
    }
}

Eine Sortier-Logik, viele sortierbare Klassen. Das ist Polymorphie via Interface.

Praxis-Hinweis (Best Practice): Der Cast ((Student) other) ist hier didaktisch vereinfacht, er kann zur Laufzeit eine ClassCastException werfen, falls other doch kein Student ist. In echtem Code nutzt man das generische Comparable<Student> aus der Java-Standardbibliothek: class Student implements Comparable<Student> mit public int compareTo(Student other). Dann ist der Vergleich typsicher und der Cast entfällt komplett (so empfiehlt es auch Bloch, Effective Java, Item 14). Wir bleiben oben beim ungenerischen Interface, um nur das Prinzip zu zeigen.

Interface deklarieren und implementieren

interface Fahrzeug {
    void starten();
    void stoppen();
    int getMaxGeschwindigkeit();
}

class Auto implements Fahrzeug {
    public void starten() {
        System.out.println("Motor an");
    }
    public void stoppen() {
        System.out.println("Motor aus");
    }
    public int getMaxGeschwindigkeit() {
        return 200;
    }
}

Pflicht: Alle Methoden des Interfaces müssen implementiert werden. Wenn auch nur eine fehlt → Compile-Error, ausser die Klasse ist abstract.

Multi-Implementation: das Killer-Feature

Java erlaubt Einfach-Vererbung mit extends (max. 1 Oberklasse), aber Mehrfach-Implementierung mit implements:

interface Schwimmen {
    void schwimmen();
}

interface Fliegen {
    void fliegen();
}

class Ente extends Tier implements Schwimmen, Fliegen {
    public void schwimmen() { System.out.println("paddel paddel"); }
    public void fliegen() { System.out.println("flatter flatter"); }
}

Die Ente erbt von Tier und implementiert 2 Interfaces. Das geht mit extends nicht (Diamond-Problem), aber mit Interfaces problemlos.

Default-Methoden (Java 8+)

Seit Java 8 dürfen Interfaces auch Default-Implementierungen anbieten. Damit kannst du Interfaces erweitern, ohne alle bestehenden Implementierer zu brechen:

interface Fahrzeug {
    void starten();

    // Default-Methode mit Implementierung
    default void hupe() {
        System.out.println("Hup hup!");
    }
}

class Auto implements Fahrzeug {
    public void starten() { /*...*/ }
    // hupe() musst du nicht implementieren, wird von Default geerbt
}

Klausur-Falle: Default-Methoden lockern die "nur Vertrag"-Regel. Manche Hochschulen behandeln Interfaces noch klassisch (nur Signaturen), prüfe dein Skript.

Private Interface-Methoden (Java 9+)

Seit Java 9 dürfen Interfaces zusätzlich private Methoden als interne Helfer enthalten. Sie sind dazu da, gemeinsamen Code mehrerer default- oder static-Methoden zu bündeln, ohne ihn nach außen sichtbar zu machen:

interface Logger {
    default void info(String msg)  { log("INFO", msg); }
    default void error(String msg) { log("ERROR", msg); }

    // private Helper, NICHT Teil der öffentlichen API
    private void log(String level, String msg) {
        System.out.println("[" + level + "] " + msg);
    }
}

Wichtig: Private Interface-Methoden gehören nicht zur öffentlichen API, sie können nur innerhalb des Interfaces selbst aufgerufen werden, eine implementierende Klasse sieht sie gar nicht und kann sie nicht überschreiben. Es ist also kein neuer Vertrags-Bestandteil, sondern reine interne Strukturierung der Default-Methoden.

Quelle/Version: Private Interface-Methoden wurden mit Java 9 eingeführt (JEP 213, "Milling Project Coin"). Spezifiziert in der Java Language Specification §9.4 (Methodendeklarationen in Interfaces); eine kompakte Einführung bietet das Oracle-Tutorial-Kapitel zu Default- und privaten Methoden. Da viele Hochschulen noch auf Java 8 oder klassischen Interfaces aufsetzen, prüfe dein Skript, ob dieses Feature klausurrelevant ist.

Konstanten in Interfaces

Felder in Interfaces sind implizit public static final (Konstanten):

interface MathKonstanten {
    double PI = 3.14159;
    double E = 2.71828;
}

class Rechner implements MathKonstanten {
    double umfang(double r) {
        return 2 * PI * r;  // direkter Zugriff
    }
}

In modernen Java-Codes ist das Anti-Pattern (Konstanten gehören in final class-Utility-Klassen oder Enums), aber Klausur kann fragen, was die Sichtbarkeit ist.

Warnung: Nutze Interface-Konstanten sparsam. In Anfängerprojekten werden sie oft als allgemeiner globaler Speicher missbraucht (jede Klasse implementiert das Interface nur, um an die Werte zu kommen). Für zusammengehörige Konstanten ist meist eine finale Utility-Klasse (final class MathKonstanten mit private Konstruktor) oder ein enum sauberer, weil dort der Vertrags-Gedanke des Interfaces nicht verwässert wird.

Interface vs. Abstrakte Klasse, der ewige Klausur-Klassiker

EigenschaftInterfaceAbstrakte Klasse
Mehrfach-Vererbung✅ (mehrere implements)❌ (nur 1 extends)
Feldernur public static final (Konstanten)beliebige Felder, alle Sichtbarkeiten
Methodenabstrakt, default + static (ab Java 8), private Helper (ab Java 9)abstrakt + konkret + private
Konstruktor❌ verboten✅ erlaubt (für Subklassen)
State (Felder mit Wert)❌ kein State✅ State möglich
Schlüsselwortimplementsextends
Sichtbarkeit Methodenimplizit publicbeliebig
Wann nutzen?Vertrag, lose Kopplung, Multi-Inheritancegemeinsamer Code-Vorrat, Template-Method

Faustregel: Erst Interface versuchen. Nur abstrakte Klasse, wenn du echten Code mehrfach teilen willst (Konstruktor, State, gemeinsame Helper).

Polymorphie via Interface-Referenz

Du kannst eine Variable vom Interface-Typ deklarieren und beliebige Implementierer zuweisen:

Fahrzeug f;
f = new Auto();
f.starten();    // ruft Auto.starten()

f = new Motorrad();
f.starten();    // ruft Motorrad.starten()

Java entscheidet erst zur Laufzeit, welche Methode passt, das nennt man dynamische Bindung (oder Late Binding). Welche Methode aufgerufen wird, hängt also am tatsächlichen Objekt-Typ (new ...()), nicht am deklarierten Typ der Variablen. Klausur-Frage Standard: "Welche Methode wird aufgerufen?", Antwort hängt von new ...(), nicht von der Variable.

Klausur-Faustregeln

1. Interface = Vertrag, kein State. Felder sind public static final (Konstanten), keine Instanzvariablen.

2. implements für Interfaces, extends für Klassen. Bei mehreren Interfaces durch Komma trennen: implements A, B, C.

3. Methoden im Interface sind implizit public. Bei der Implementierung MUSST du explizit public schreiben, die Sichtbarkeit darf gegenüber dem Interface nicht eingeschränkt (weniger offen) werden.

4. Default-Methoden sind nicht statisch. Sie werden auf Instanzen aufgerufen wie normale Methoden. Statische Methoden im Interface (static Schlüsselwort) gibts seit Java 8 auch, aber separat.

5. Polymorphie funktioniert über Interface-Referenz. List<Integer> l = new ArrayList<>(); ist Standard-Java-Stil, Variable vom Interface-Typ, Objekt von konkreter Klasse.

Häufige Stolpersteine

1. public bei Implementierung vergessen. (TOP-Falle) Im Interface ist die Methode implizit public. Wenn du in der Klasse void starten() (ohne public) schreibst, ist das package-private, also weniger sichtbar als vom Interface gefordert → Compile-Error (eine Implementierung darf die Sichtbarkeit nie einschränken, nur beibehalten). Das ist der mit Abstand häufigste Klausur-Fehler bei Interfaces.

2. Interface mit new instanziieren. (TOP-Falle) Fahrzeug f = new Fahrzeug(); geht nicht (außer mit anonymer Klasse). Du brauchst eine konkrete Implementierer-Klasse. Diese Falle wird in Klausuren extrem gern als Ankreuz-Distraktor versteckt.

3. Methoden-Signatur abweichen lassen. Wenn das Interface int compareTo(Sortierbar) vorgibt und du int compareTo(Object) schreibst, implementierst du das Interface nicht. Bei Signaturmismatch wird die Methode überladen statt überschrieben.

4. Konstruktoren im Interface erwarten. Interfaces haben keine Konstruktoren. Wenn du Setup brauchst, mach es in der Implementierer-Klasse.

5. Default- und abstract-Methoden mit gleicher Signatur in 2 Interfaces. Bei Multi-Implementation müsstest du selbst überschreiben und entscheiden welche Default-Methode du nehmen willst (Interface.super.methode()).

Klausur-Beispielaufgabe

Beispiel (typischer Klausur-Stil, zur Übung konstruiert).

Gegeben sind ein Interface und zwei Klassen:

interface Zahlbar {
    double betrag();
}

class Rechnung implements Zahlbar {
    private double summe;
    public Rechnung(double summe) { this.summe = summe; }
    public double betrag() { return summe; }
}

abstract class Dokument {
    abstract String titel();
}

(a) Warum ist Zahlbar z = new Zahlbar(); ein Fehler, Zahlbar z = new Rechnung(99.0); aber erlaubt? (b) Die Klasse Mahnung soll sowohl ein Dokument sein als auch Zahlbar. Schreibe den Kopf der Klassendeklaration (nur die erste Zeile, ohne Body). (c) Eine Methode double summe(Zahlbar[] posten) addiert die Beträge aller Elemente. Warum funktioniert sie für ein Array, das Rechnung- und Mahnung-Objekte gemischt enthält? Wie heißt das zugrunde liegende Prinzip?

Lösung:

  • (a) Zahlbar ist ein Interface ohne Implementierung, ein Interface lässt sich nicht direkt mit new instanziieren. new Rechnung(99.0) erzeugt dagegen ein konkretes Objekt; weil Rechnung Zahlbar implementiert, darf die Referenz vom Interface-Typ Zahlbar sein (Polymorphie über Interface-Referenz).
  • (b) class Mahnung extends Dokument implements Zahlbar { , extends (genau eine Klasse) steht immer vor implements (beliebig viele Interfaces).
  • (c) Alle Elemente sind vom statischen Typ Zahlbar und bieten daher garantiert betrag() an. Zur Laufzeit ruft Java über dynamische Bindung die jeweils passende Implementierung (Rechnung.betrag() oder Mahnung.betrag()) auf. Das Prinzip heißt Polymorphie (über eine Interface-Referenz).
Teil 2·Visualisierung / Interaktiv

Interaktiv verstehen

Interface-UML-Visualizer

3 Szenarien, jedes zeigt das UML-Diagramm + Code parallel:

  1. Einfaches Interface, eine Klasse implementiert ein Interface
  2. Multi-Implementation, eine Klasse implementiert mehrere Interfaces
  3. Interface-Hierarchie, ein Interface erbt von einem anderen via extends

Schalte direkt auf Szenario Multi-Implementation (Ente), dort siehst du auf einen Blick, was implements Schwimmen, Fliegen bedeutet. Beobachte wie sich die Pfeile (gestrichelt = implements, durchgezogen = extends) und der Code ändern.

Interaktive Visualisierung

Interaktive Komponente: probiere sie im Topic-Player oben aus.

Klausur-Tipp: UML-Diagramme in Java-Klausuren nutzen gestrichelte Pfeile für implements und durchgezogene Pfeile für extends. Wenn du es siehst, weißt du sofort die Beziehung. Frage in der Prüfung: "Welche Methoden muss Ente implementieren?", Antwort: alle abstrakten Methoden aller Interfaces, die sie implementiert + Schwimmen + Fliegen + Tier-Methoden, die nicht in Tier implementiert sind.


Code-Stepper: Schritt für Schritt

Drei Demos zum Durchklicken. Klick Step oder Auto und beobachte, wie sich Variablen, Aufruf-Ziel und Konsole pro Schritt ändern.

1. implements: der Vertrag zwingt zur Implementierung

Auto implementiert Fahrzeug und muss daher jede Interface-Methode mit public ausprogrammieren. Wir verfolgen einen starten()-Aufruf.

Interaktive Visualisierung

Interaktive Komponente: probiere sie im Topic-Player oben aus.

2. Polymorphie + dynamische Bindung

Dieselbe Variable vom Interface-Typ Fahrzeug zeigt nacheinander auf verschiedene Objekte. Welche starten()-Methode läuft, entscheidet sich erst zur Laufzeit anhand des echten Objekt-Typs, nicht anhand der Variablen-Deklaration.

Interaktive Visualisierung

Interaktive Komponente: probiere sie im Topic-Player oben aus.

3. Default-Methode: geerbt ohne eigene Implementierung

Seit Java 8 darf ein Interface eine default-Methode mitbringen. Auto implementiert nur starten() selbst, hupe() wird aus dem Interface geerbt, ohne dass die Klasse sie schreibt.

Interaktive Visualisierung

Interaktive Komponente: probiere sie im Topic-Player oben aus.

Klausur-Tipp: Achte bei Tracing-Aufgaben immer auf den tatsächlichen Typ hinter der Interface-Variablen (new ...()), nicht auf den deklarierten Typ. Genau dort versteckt sich die typische Polymorphie-Frage "Welche Methode wird aufgerufen?".

Teil 3·Quiz / Klausurfragen

Praxis-Übung

Interfaces, Praxis-Übung

6 Aufgaben zu Interface-Syntax, Multi-Implementation, Polymorphie.

Klausurfragen mit Lösungen (6)

F1.Welche Aussage über Interfaces in Java ist KORREKT?

Antwort: Ein Interface definiert nur Methoden-Signaturen (vor Java 8)

Erklärung: Ein klassisches Interface (vor Java 8) enthält nur abstrakte Methoden-Signaturen. Konstruktoren (auch kein Default-Konstruktor) gibt es nicht, ein Interface erweitert andere Interfaces mit `extends` (nicht `implements`) und kann nie von einer Klasse (auch keiner abstrakten) erben.

F2.Welches Schlüsselwort nutzt eine Klasse, um ein Interface umzusetzen?

Antwort: implements

Erklärung: `class Auto implements Fahrzeug`, implements für Interfaces, extends für Klassen. Beides zusammen: `class Auto extends Fahrzeug implements Bremsbar, Lenkbar`.

F3.Eine Klasse kann mehrere Interfaces gleichzeitig implementieren.

Antwort: Wahr

Erklärung: RICHTIG. `class Ente extends Tier implements Schwimmen, Fliegen` ist erlaubt. Im Gegensatz dazu darf eine Klasse nur EINE Oberklasse via extends haben. Genau deshalb sind Interfaces das Java-Mittel für Mehrfach-Vererbung.

Typ: Wahr/Falsch

F4.Du kannst ein Interface direkt mit new instanziieren, z.B. Fahrzeug f = new Fahrzeug();.

Antwort: Falsch

Erklärung: FALSCH. Interfaces können nicht direkt instanziiert werden, sie haben keine Implementierung. Du brauchst eine konkrete Klasse: `Fahrzeug f = new Auto();`. Ausnahme: anonyme Klassen mit `new Fahrzeug() { ... };` (aber da gibst du die Implementierung sofort mit).

Typ: Wahr/Falsch

F5.Welche Aussagen über Interface vs. abstrakte Klasse sind RICHTIG?

Richtige Antworten: Interface erlaubt Mehrfach-Vererbung, abstrakte Klasse nicht; Abstrakte Klasse kann Konstruktor haben, Interface nicht; Abstrakte Klasse kann konkrete Methoden enthalten; Default-Methoden gibt es nur in Interfaces

Erklärung: Richtig: Multi-Inheritance nur via Interface, Konstruktor nur in abstrakter Klasse, konkrete Methoden in abstrakter Klasse, Default-Methoden nur in Interfaces. Falsch: Interface hat KEIN State (nur Konstanten via public static final), und keine der beiden kann direkt instanziiert werden.

Typ: Multi-Select

F6.Ordne das Feature dem richtigen Konstrukt zu:

Zuordnungen:

  • Konstruktor → nur abstrakte Klasse
  • Mehrfach-Vererbung → nur Interface
  • Instanzvariablen mit State → nur abstrakte Klasse
  • Default-Methoden (mit Implementierung) → Interface ab Java 8

Erklärung: Standard-Vergleich. Wenn du dies auswendig hast, sitzt die Klausur-Frage 'Interface vs. abstract class' in 30 Sekunden.

Typ: Zuordnung

Teil 4·Quiz / Klausurfragen

Klausur-Quiz

Klausurfragen mit Lösungen (6)

F1.Wie sind Methoden in einem Interface (ohne expliziten Modifier) standardmäßig sichtbar?

Antwort: public

Erklärung: Methoden in Interfaces sind implizit `public abstract`. Du musst beim Implementieren in der Klasse explizit `public` schreiben, strenger geht nicht (das wäre eine Sichtbarkeits-Reduktion und Compile-Error).

F2.Was sind Felder in einem Interface (ohne expliziten Modifier) automatisch?

Antwort: public static final (Konstanten)

Erklärung: Felder in Interfaces sind IMMER public static final, egal ob du es hinschreibst oder nicht. Konstanten also. Anti-Pattern in modernem Java (besser Enum/final class), aber Klausur-Wissen.

F3.Wenn eine Klasse ein Interface mit 5 Methoden implementiert, aber nur 3 davon ausprogrammiert, ist das ein Compile-Fehler.

Antwort: Wahr

Erklärung: RICHTIG, ausser die Klasse wird als `abstract` markiert. Eine konkrete Klasse MUSS alle abstrakten Methoden des Interfaces implementieren. Sonst Compile-Error: 'class is not abstract and does not override abstract method ...'

Typ: Wahr/Falsch

F4.Eine Klasse implementiert ein Interface mit dem Schlüsselwort {{1}}. Mehrere Interfaces werden durch {{2}} getrennt. Methoden in einem klassischen Interface sind implizit {{3}} und {{4}}.

Lösungen pro Lücke:

  • {{1}}: implements
  • {{2}}: Komma / , / Kommata
  • {{3}}: public
  • {{4}}: abstract

Erklärung: Standard-Syntax. `class A implements I1, I2, I3 { ... }` mit allen Methoden public abstract (im klassischen Sinne, vor Java 8 Default-Methoden).

Typ: Lückentext

F5.Klasse C implementiert die Interfaces A und B. Beide haben eine Default-Methode void m() mit unterschiedlichem Code. Was passiert beim Compile?

Antwort: Compile-Fehler, Klasse C muss `m()` selbst überschreiben

Erklärung: Diamond-Konflikt bei Default-Methoden: Java zwingt dich, in C ein eigenes `m()` zu definieren. Du kannst aber via `A.super.m()` oder `B.super.m()` eine der beiden konkret aufrufen.

F6.Sortiere: Klassen Tier, Interfaces Schwimmen, Fliegen, Klasse Ente extends Tier implements Schwimmen, Fliegen. Welche Reihenfolge muss in der Klassen-Deklaration stehen?

Richtige Reihenfolge:

  1. class
  2. Ente
  3. extends Tier
  4. implements Schwimmen, Fliegen
  5. { ... }

Erklärung: Java-Syntax-Reihenfolge ist FEST: `class <Name> extends <Klasse> implements <I1, I2> { ... }`. `extends` IMMER vor `implements`. Tauschen → Compile-Error.

Typ: Reihenfolge

Zur KategorieProgrammiergrundlagen.Mehr Themen entdeckenZum Themen-Hub.

UniProMax ist eine themenbasierte Lernplattform für Studierende an deutschen Unis.

Wir glauben, dass Verstehen besser ist als Auswendiglernen. Wir bauen Lerneinheiten die zeigen statt erzählen. Code, Visualisierung, Quiz. Auf Deutsch.

Marke

UniProMaxUniProMax

Themenbasiert, visuell, interaktiv.

Inhalte

  • Alle Themen (Hub)
  • Programmiergrundlagen
  • Algorithmen
  • Mathematik
  • Statistik
  • Datenbanken
  • Rechnungswesen
  • VWL

Studiengang-Filter

  • Informatik
  • Wirtschaftsinformatik
  • BWL
  • Data Science
  • VWL
  • Wirtschaftsingenieurwesen
  • Mathe
  • Psychologie
  • weitere Studiengänge folgen

Plattform

  • Mein Fortschritt
  • Impressum
  • Datenschutz
© 2026 UniProMaxAlle Systeme onlinev0.2 / Sommersemester 2026
UniProMaxUniProMaxUniProMaxUniProMax