Java: Abstrakte Klassen
Willemers Informatik-Ecke
Polymorphie Java Klassenattribute (static)

Klassen ohne Inhalt

Die kW-Leistung eines Fahrzeugs wird bei Kraftfahrzeugen durch den Motor bestimmt. Bei Fahrrädern oder Segelbooten ist nicht so offensichtlich, wie sie berechnet oder implementiert wird.

Die Basisklasse Fahrzeug ist zwar nicht in der Lage, die kW-Zahl zu berechnen, aber da Versicherungen die Leistung als Basis verwenden, könnte sie allen Fahrzeugen vorschreiben, eine kW-Leistung zu berechnen.

Die Methoden setKw und getKw wären also erst durch erweiternde Klassen zu implementieren. Aber die Basisklasse kann die Methoden als Vorgabe deklarieren, indem sie als abstrakte Methode vorgegeben wird.

Eine abstrakte Methode wird nicht durch die Basisklasse, sondern erst von der erweiternden Klasse implementiert. Enthält eine Klasse eine abstrakte Methode, muss sie als abstrakte Klasse deklariert werden.

public abstract class Fahrzeug {
    private int plaetze;
    public int getPlaetze() {
        return plaetze;
    }
    public void setPlaetze(int paraPlaetze) {
        plaetze = paraPlaetze;
    }
    abstract int getKw();
    abstract void setKw(int kw);
}
Von einer abstrakten Klasse kann keine Instanz gebildet, also kein Objekt erzeugt werden. Es wird also noch eine erweiterte Klassse benötigt, die die abstrakte Methode implementiert. Das tut aber die Klasse Kraftfahrzeug bereits.
public class Kraftfahrzeug extends Fahrzeug {
    private int kW;
    public int getKw() {
        return kW;
    }
    public void setKw(int kW) {
        this.kW = kW;
    }
}
Ein Fahrrad hat keine kW. Eine entsprechende Klasse würde dann beispielsweise 0 zurückgeben und das Setzen des Wertes ignorieren.
public class Fahrrad extends Fahrzeug {
    public int getKw() {
        return 0;
    }
    public void setKw(int kW) {
    }
}
Die Methode getPlaetze muss nicht implementiert werden, da sie ja bereits von der Basisklasse implementiert wird.

Interface

Manche Klassen sind so abstrakt, dass sie keinerlei Implementierung mehr besitzen. Eine solche Klasse nennt man in Java ein Interface. Ein Interface hat weder Methoden noch Attribute, kann und weiß also nichts. Aber es schreibt seinen Erweiterungen vor, was sie zu implementieren haben.

Lediglich Konstanten dürfen von Interfaces definiert werden. Dies ist sogar sehr sinnvoll. Allerdings sind Konstanten ja auch eigentlich eher Namensgeber als Implementierer.

Gegen das Interface programmieren

Ein Interface dient also als Vorgabe für die Implementierung. Bei der Software-Entwicklung wird es darum gern vorgegeben, um die Implementierung nachträglich leicht ändern zu können.

So kann eine Schnittstelle für das Speichern von Kunden geschaffen werden, und in einer Zeile festgelegt werden, ob die Implementierung über eine Datenbank oder beispielsweise über die Cloud laufen soll. Die späteren Sicherungsaufrufe bleiben davon unberührt.

Speicher speicher = new DatenbankSpeicher();
// ...
speicher.sichere(kunden);

Mehrfachvererbung per Interface

Mehrfachvererbung kann dann problematisch sein, wenn eine Klasse zwei andere Klassen erweitert und diese unter dem gleichen Namen zwei unterschiedliche Methoden anbieten. Um Konflikte dieser Art zu vermeiden, verbietet Java die Mehrfacherweiterung.

Eine Klasse darf nur eine Klasse erweitern, aber beliebig viele Interfaces implementieren. Auf diese Weise ist gewährleistet, dass die Implementierung der Methode eindeutig bleibt.

Interfaces werden implementiert

Wir definieren nun Fahrzeug als Interface. Es ist analog zu der Klasse Fahrzeug, nur dass das Interface keinerlei Implementierung besitzt.
interface Fahrzeug {
    void setPlaetze(int paraPlaetze);
    int getPlaetze();
    void setKw(int kw);
    int getKw();
}
Damit wir auch einmal eine Mehrfachvererbung sehen können, definieren wir ein Interface Wohnung. Dieses Interface schreibt vor, dass jede implementierende Klasse Fenster haben soll.
interface Wohnung {
    int getFenster();
    void setFenster(int anzahl);
}
Diese beiden Interfaces werden nun von der Klasse Wohnmobil implementiert. Dazu müssen sowohl die Methoden von Fahrzeug als auch die Methode von Wohnung implementiert werden.
class Wohnmobil implements Fahrzeug, Wohnung {
    private int plaetze;
    private int fenster;
    public int getPlaetze() {
        return plaetze;
    }
    public void setPlaetze(int paraPlaetze) {
        plaetze = paraPlaetze;
    }
    public int getFenster() {
        return fenster;
    }
    public void setFenster(int anzahl) {
        fenster = anzahl;
    }
}

Video


Polymorphie Java Klassenattribute (static)