20% off with code ERSTIS26
4 min read 22 Jun 2026

Abstrakte Klassen vs. Interfaces Java: Der Unterschied

Abstrakte Klassen vs. Interfaces in Java: Wann wende ich was an? Eine klare Erklärung für Azubis, Studenten und Einsteiger.

Marcel Schmidtpeter By Marcel Schmidtpeter 22 Jun 2026
Abstrakte Klassen vs. Interfaces Java: Der Unterschied

Du sitzt vor deiner IHK-Abschlussprüfung oder der Uni-Klausur und die Aufgabe verlangt: "Modellieren Sie ein Fahrzeug-System mit abstrakten Klassen und Interfaces." Panik? Nicht nötig. Viele Azubis, Studenten und Berufseinsteiger haben genau hier Schwierigkeiten. Sie wissen oft nicht genau, wann sie welches Konzept nutzen sollen. Daher lass uns jetzt klären, wie sich abstrakte Klassen und Interfaces in Java unterscheiden - und wann du welches einsetzt.

Wenn du deine Grundlagen zu Klassen und Objekten noch einmal auffrischen möchtest, hilft dir unser Beitrag zu Java Klassen & Objekte.

Was ist eine abstrakte Klasse in Java?

Eine abstrakte Klasse ist eine Klasse, die du nicht direkt instanziieren kannst. Das bedeutet, du kannst kein Objekt mit `new` davon erstellen. Sie dient als Vorlage für andere Klassen und wird mit dem Schlüsselwort `abstract` markiert.

Stell dir eine abstrakte Klasse wie einen Bauplan vor, bei dem einige Details noch fehlen. Die konkreten Klassen müssen diese Lücken füllen, um funktionstüchtig zu sein.

java
// Abstrakte Klasse als Vorlage
public abstract class Fahrzeug {

  // Normale Attribute sind erlaubt
  protected String marke;

  // Konstruktor funktioniert
  public Fahrzeug(String marke) {
    this.marke = marke;
  }

  // Abstrakte Methode - kein Rumpf, muss implementiert werden
  public abstract void starten();

  // Normale Methode mit Implementierung
  public void markeAnzeigen() {
    System.out.println("Marke: " + marke);
  }
}

Wichtig: Abstrakte Klassen können sowohl abstrakte Methoden (ohne Implementierung) als auch konkrete Methoden (mit Code) enthalten. Zudem dürfen sie Konstruktoren und Attribute besitzen, um Zustand zu speichern.

Für weiterführende Details zu abstrakten Klassen kannst du in der offiziellen Java-Dokumentation von Oracle nachlesen.

Was ist ein Interface in Java?

Ein Interface ist im Grunde ein Vertrag. Es definiert lediglich, welche Methoden eine Klasse haben muss, aber nicht, wie diese Methoden funktionieren. Seit Java 8 gibt es zwar `default`-Methoden mit Implementierung, aber das Grundprinzip bleibt gleich: Es geht um das "Was", nicht um das "Wie".

Eine weitere hilfreiche Quelle für die Grundlagen ist W3Schools zu Java Interfaces.

java
// Interface als Vertrag
public interface Elektrisch {
  // Konstante (implizit public static final)
  int MAX_SPANNUNG = 400;

  // Abstrakte Methode - muss implementiert werden
  void laden();

  // Default-Methode seit Java 8
  default void ladestandPruefen() {
    System.out.println("Ladestand wird geprueft...");
  }
}

Wichtig: Interfaces definieren das Verhalten. Eine Klasse kann mehrere Interfaces implementieren, muss aber für jede darin definierte Methode eine Lösung liefern.

Was sind die Unterschiede zwischen abstrakten Klassen und Interfaces in Java?

Die Unterschiede wirken auf den ersten Blick theoretisch, haben aber massive Auswirkungen auf deinen Software-Entwurf. Hier ist der direkte Vergleich, damit du den Unterschied schnell verstehst.

Eigenschaft

Abstrakte Klasse

Interface

Schlüsselwort

`abstract class`

`interface`

Instanziierung

Nicht möglich

Nicht möglich

Konstruktoren

Ja

Nein

Attribute

Ja (beliebige Zugriffsebenen)

Nur Konstanten (`public static final`)

Methoden

Konkret & Abstrakt möglich

Meist abstrakt (oder `default`/`static`)

Vererbung

Nur eine Klasse (Einfachvererbung)

Mehrere Interfaces möglich

Sichtbarkeit

`private`, `protected`, `public`

Fast immer `public`

Zweck

Code-Wiederverwendung & Aufbau

Definition von Fähigkeiten

Die Entscheidung für eines der beiden Konzepte hängt oft davon ab, wie eng die Klassen zusammengehören.

Wann nutzt du abstrakte Klassen und wann Interfaces?

Die Entscheidung fällt oft schwer, deshalb gibt es hier eine klare Empfehlung. Orientiere dich an der Beziehung zwischen deinen Objekten.

Nutze eine abstrakte Klasse, wenn:

  • Klassen eng miteinander verwandt sind (z. B. `Hund`, `Katze` → erben von `Tier`).

  • Du Code (Logik) teilen willst, damit du ihn nicht mehrfach schreiben musst.

  • Du nicht-statische Attribute und Konstruktoren benötigst, um den Zustand zu verwalten.

Nutze ein Interface, wenn:

  • Klassen völlig unterschiedliche Hintergründe haben, aber das gleiche Verhalten zeigen sollen.

  • Du Mehrfachvererbung brauchst (eine Klasse soll verschiedene Dinge "können").

  • Du eine Fähigkeit definieren willst (z.B. `Ladbar`, `Fahrbar`), die unabhängig vom Objekttyp ist.

Faustregel: Wenn du dich fragst "Ist das eine IST-EIN-Beziehung?" (Ein Auto IST EIN Fahrzeug) → nutze eine abstrakte Klasse. Wenn du denkst "Kann das Objekt etwas Bestimmtes?" (Ein Auto KANN laden) → nutze ein Interface.

Wie setzt du das in der Praxis um?

Theorie ist gut, Praxis ist besser. Wir bauen ein System für verschiedene Fahrzeuge. Einige sind elektrisch, andere nicht. Hier kombinieren wir beide Konzepte.

java
// Abstrakte Basisklasse fuer gemeinsame Attribute und Methoden
public abstract class Fahrzeug {

  protected String marke;
  protected int baujahr;

  public Fahrzeug(String marke, int baujahr) {
    this.marke = marke;
    this.baujahr = baujahr;
  }

  // Konkrete Methode - Code-Wiederverwendung
  public void infoAnzeigen() {
    System.out.println(marke + " aus " + baujahr);
  }

  // Abstrakt - Unterklassen muessen das implementieren
  public abstract double berechneWert();
}

// Interface fuer die Faehigkeit "Elektrisch"
public interface Elektrisch {
  int MAX_KWH = 100;

  void laden();
  double ladestand();
}

// Konkrete Klasse erbt von Fahrzeug UND implementiert Elektrisch
public class ElektroAuto extends Fahrzeug implements Elektrisch {

  private double akkuKapazitaet;

  public ElektroAuto(String marke, int baujahr, double akkuKapazitaet) {
    super(marke, baujahr); // Aufruf Konstruktor der abstrakten Klasse
    this.akkuKapazitaet = akkuKapazitaet;
  }

  @Override
  public double berechneWert() {
    // Wert faellt mit Alter
    return 30000.0 - (2024 - baujahr) * 3000.0;
  }

  @Override
  public void laden() {
    System.out.println("Auto wird geladen...");
  }

  @Override
  public double ladestand() {
    return akkuKapazitaet * 0.8; // 80% geladen
  }
}

// Nutzung in der main-Methode
public class Main {

  public static void main(String[] args) {
    ElektroAuto tesla = new ElektroAuto("Tesla", 2022, 75.0);
    tesla.infoAnzeigen(); // Geerbte Methode von Fahrzeug
    tesla.laden(); // Methode aus Interface Elektrisch
    System.out.println("Wert: " + tesla.berechneWert());
    System.out.println("Ladestand: " + tesla.ladestand() + " kWh");
  }
}

Siehst du den Unterschied? `ElektroAuto` erbt die `infoAnzeigen()`-Methode von `Fahrzeug` - das spart Code. Gleichzeitig zwingt das Interface `Elektrisch` die Klasse dazu, `laden()` und `ladestand()` bereitzustellen.

Welche Fehler passieren häufig?

Gerade in der Prüfungssituation passieren Flüchtigkeitsfehler. Hier sind die Klassiker, die du vermeiden musst.

Fehler 1: Instanziierung versuchen

Du versuchst, von einer unvollständigen Vorlage ein Objekt zu bauen. Das geht nicht.

java
// FALSCH - compiliert nicht
Fahrzeug f = new Fahrzeug("BMW", 2020);

// RICHTIG - ueber konkrete Unterklasse
Fahrzeug f = new ElektroAuto("Tesla", 2022, 75.0);

Warum funktioniert das nicht? Weil abstrakte Klassen und Interfaces Lücken haben. Der Compiler weiß nicht, wie er eine abstrakte Methode ausführen soll, wenn keine Implementierung existiert.

Fehler 2: Abstrakte Methoden nicht implementieren

Wenn du eine abstrakte Klasse erbst oder ein Interface implementierst, musst du alle Aufgaben erledigen.

java
// FALSCH - berechneWert() fehlt
public class Auto extends Fahrzeug {
  // Compiler-Fehler: Auto is not abstract and does not override abstract method berechneWert()
}

// RICHTIG - alle abstrakten Methoden implementieren
public class Auto extends Fahrzeug {

  public Auto(String marke, int baujahr) {
    super(marke, baujahr);
  }

  @Override
  public double berechneWert() {
    return 20000.0;
  }
}

Fehler 3: Mehrfachvererbung bei Klassen versuchen

Java erlaubt dir nicht, von zwei Eltern gleichzeitig zu erben, um Komplexität zu vermeiden.

java
// FALSCH - Java erlaubt keine Mehrfachvererbung bei Klassen
public class ElektroAuto extends Fahrzeug, Object { }

// RICHTIG - eine Klasse, mehrere Interfaces
public class ElektroAuto extends Fahrzeug implements Elektrisch, Comparable {
  // ...
}

Merke: Java erlaubt nur eine direkte Basisklasse (`extends`), aber beliebig viele Interfaces (`implements`). Das ist der Hauptgrund, warum Interfaces in der modernen Softwareentwicklung so wichtig sind.

Häufige Fragen zu abstrakten Klassen und Interfaces

Hier beantworten wir Fragen, die oft in Foren oder Klausuren auftauchen.

Kann eine abstrakte Klasse ein Interface implementieren?

Ja, das ist absolut erlaubt. Eine abstrakte Klasse kann ein Interface implementieren, muss dann aber nicht zwingend alle Methoden sofort selbst ausprogrammieren. Sie kann die Implementierungspflicht an ihre (konkreten) Unterklassen weitergeben.

Können Interfaces Attribute haben?

Ja, aber nur eingeschränkt. Alle Attribute in einem Interface sind implizit `public static final`, also Konstanten. Normale Instanzvariablen, die den Zustand eines Objekts speichern, sind in Interfaces nicht erlaubt.

Warum sollte ich abstrakte Klassen noch nutzen, wenn es Interfaces gibt?

Das ist eine gute Frage. Abstrakte Klassen sind immer dann nötig, wenn du Zustand (also Werte in Variablen) speichern oder Code wiederverwenden willst. Interfaces (vor Java 8) hatten gar keinen Code. Auch heute noch bieten abstrakte Klassen Konstruktoren und nicht-öffentliche Modifier (`protected`), was Interfaces nicht können.

Was passiert, wenn zwei Interfaces die gleiche Methode vorschreiben?

Wenn eine Klasse zwei Interfaces implementiert, die beide eine Methode mit demselben Namen und denselben Parametern verlangen (Signaturen identisch), ist das meist kein Problem - eine Implementierung genügt für beide. Haben die Interfaces jedoch unterschiedliche Rückgabetypen, gibt es einen Compiler-Fehler.

Wie du den Stoff am besten übst?

Verstehen ist gut, aber codieren bringt es. Erstelle ein kleines Übungsprojekt.

Definiere eine abstrakte Klasse `Mitarbeiter` (mit Attributen wie Name und Gehalt).

Leite dann `Entwickler` und `Designer` von `Mitarbeiter` ab.

Erstelle ein Interface `Projektleiter` mit einer Methode `meetingLeiten()`.

Lass nur den `Entwickler` dieses Interface implementieren.

Warum diese Übung? Weil du hier Zugehörigkeit (IST-EIN Mitarbeiter) von Fähigkeit (KANN Projekte leiten) trennst. Genau das ist der Kern der Unterscheidung zwischen Abstrakten Klassen und Interfaces.

Fazit

Der Unterschied zwischen abstrakten Klassen und Interfaces in Java lässt sich auf eine einfache Formel bringen: Abstrakte Klassen teilen Code und Zustand, Interfaces teilen Fähigkeiten und Verträge. Nutze abstrakte Klassen für enge Verwandtschaft (IST-EIN), Interfaces für lose gekoppelte Fähigkeiten (KANN). Wenn du dieses Konzept verstanden hast, fallen Aufgaben zur Modellierung in deiner Prüfung deutlich leichter.

Wenn du bei Themen wie Abstrakte Klassen, Interfaces oder anderen Java-Konzepten Unterstützung brauchst - ob für die IHK-Prüfung, die Uni-Klausur oder den Berufseinstieg - dann schau dir study-it.education an. Dort bekommst du individuelle Online-Nachhilfe, die genau auf dein Level und deine Fragen eingeht.


First chat · 0 € · 30 min

Need someone to walk through this with you?

Instead of re-reading: 30 min with a senior dev.

Book a free first chat →
About the author
Marcel Schmidtpeter
Marcel Schmidtpeter

Abstrakte Klassen vs. Interfaces in Java: Wann wende ich was an? Eine klare Erklärung für Azubis, Studenten und Einsteiger.

marcel.schmidtpeter@study-it.education →
Keep reading

More reading