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.
Von Marcel Schmidtpeter 22. Juni 2026
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.
// 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.
// 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.
// 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.
// 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.
// 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.
// 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.
1:1-Hilfe zu diesem Thema?
Brauchst du jemand, der das mit dir durchgeht?
Statt nochmal lesen: 30 min mit einem Senior-Dev.
Kostenloses Erstgespräch buchen →
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 →Mehr Lesestoff
Java this Keyword einfach erklärt: So nutzt du es richtig
Das Java this Keyword referenziert das aktuelle Objekt. Lerne, wie du es in Konstruktoren und Methoden einsetzt – perfekt für IT-Lernende!
Java Überladen vs. Überschreiben: Der Unterschied einfach erklärt
Unterschied zwischen Überladen und Überschreiben in Java einfach erklärt. Für Azubis, Studenten und Berufseinsteiger.
Java final Keyword: Klassen, Methoden & Variablen
Das Java final Keyword regelt Unveränderlichkeit. Erfahre hier alles über finale Klassen, Methoden und Variablen für deinen Start in die IT.