Home > Informatik > Einführung in die OOP > 10.Abstakte Klassen/Interfaces > 10.1 Abstrakte Klassen

10.1 Die Klasse Buch - Neuauflage

Im letzten Abschnitt haben wir gesehen, dass Polymorphie es ermöglicht, Objekte unterschiedlicher Unterklassen über eine gemeinsame Oberklasse anzusprechen. In unserem Beispiel konnten Buch-, Roman- und Fachbuch-Objekte gemeinsam in einer ArrayList<Buch> gespeichert werden, und beim Aufruf der Methode zeige() wurde zur Laufzeit automatisch die jeweils passende Implementierung ausgeführt.

Vielleicht haben Sie sich beim Studium der Code-Beispiele schon gefragt, ob es überhaupt sinnvoll ist, ein "allgemeines Buch" als eigenständiges Objekt zu erzeugen. In vielen Anwendungen existiert ein solches Objekt gar nicht: Ein Buch ist entweder ein Roman, ein Fachbuch, ein Hörbuch oder eine andere konkrete Ausprägung. Die Oberklasse beschreibt damit eher ein abstraktes Konzept als ein reales Objekt.

Genau an dieser Stelle kommen abstrakte Klassen ins Spiel. Dieses wichtige Konzept der OOP wird auf dieser Seite näher erläutert.

10.1.1 Problemstellung und Lösung

Schauen wir uns noch einmal den Quelltext der Klasse Buch in einer vereinfachten Form an:

Die Klasse Buch

public class Buch
{
    private String titel, autor;
    private int jahr;

    public Buch(String titel, String autor, int jahr)
    {
        this.titel  = titel;
        this.autor = autor;
        this.jahr   = jahr;
    }

    public void zeige()
    {
        System.out.println("-----------------------------------------------");
        System.out.printf("%-12s: %-40s%n","Titel",titel);
        System.out.printf("%-12s: %-40s%n","Autor",autor);
        System.out.printf("%-12s: %-40s%n","Jahr",jahr);
        zeigeSpezifischeDaten();
        System.out.println("______________________________________________/");
        System.out.println();
    }

    public void zeigeSpezifischeDaten()
    {

    }
}

Die Methode zeigeDaten() enthält keinen Quelltext. Sie dient lediglich als Platzhalter, damit die Unterklassen Roman, Sachbuch, Lexikon und Lehrbuch eigene zusätzliche Daten ausgeben können.

Die Betonung liegt hier auf "können". Eine Unterklasse von Buch kann nämlich zeigeDaten() überschreiben, muss dies aber nicht. Wird die Methode von einer Unterklasse nicht überschrieben, werden die spezifischen Daten der Unterklasse nicht ausgegeben.

Bei einem Roman-Objekt wird dann das Genre nicht ausgegeben, bei einem Fachbuch-Objekt wird das Fachgebiet unterschlagen und so weiter.

Abstrakte Methoden

Solche Probleme kann man mit abstrakten Methoden lösen:

	public class Buch
{
    ...
    
    public void zeige()
    {
        ...
        zeigeDaten();
        ...
    }

    public abstract void zeigeDaten();
}

Eine abstrakte Methode besitzt nur eine Signatur. Ein Methodenrumpf fehlt vollständig. Damit legt die Oberklasse fest, dass jede Unterklasse diese Methode bereitstellen muss.

Abstrakte Klassen

Eine Klasse mit mindestens einer abstrakten Methode muss ebenfalls als abstrakt gekennzeichnet werden:

public abstract class Buch
{
    private String titel, autor;
    private int jahr;

    ...

    public abstract void zeigeSpezifischeDaten();
}

Die Klasse Buch ist jetzt zu einer abstrakte Klasse geworden.

Allerdings können von einer abstrakten Klasse keine Objekte mehr erzeugt werden. Ein Aufruf wie

Buch b = new Buch("Java", "Meyer", 2026);

führt zu einem Compiler-Fehler.

In unserem Buchprojekt ist das aber nicht unbedingt ein Nachteil. Ein "allgemeines Buch" kommt praktisch nicht vor. Stattdessen arbeiten wir mit konkreten Unterklassen wie Roman, Sachbuch etc.

Der Vorteil abstrakter Klassen besteht also darin, dass die gemeinsame Struktur an einer Stelle festgelegt wird, während die Unterklassen die Details implementieren.

Merke:

Abstrakte Klassen

  • Abstrakte Klassen enthalten mindestens eine abstrakte Methode.
  • Abstrakte Methoden müssen von allen nicht-abstrakten Unterklassen überschrieben werden.
  • Von abstrakten Klassen können keine Objekte erzeugt werden.
Abstrakte Klassen

Auf dieser Seite wird noch stärker auf das Thema eingegangen. Auch auf die Bedeutung abstrakter Klassen für das Design-by-Contract-Prinzip wird hier näher eingegangen.

Seitenanfang