~Java4Beginners~
~Java4Beginners~

Vererbung

Durch die Vererbung können wir Eigenschaften für mehrere Klassen zugleich modellieren, indem wir sie ein einziges Mal in der gemeinsamen Superklasse definieren. Wir können davon ausgehen, dass alle Subklassen (auch solche, die wir noch gar nicht definiert haben) eben diese Eigenschaft erhalten werden.

Basis und Unterklassen

Eine Unterklasse ist eine Klasse, welche von einer anderen Klasse (Basisklasse) abgeleitet ist.

  • Oft hört man auch das Prinzip der Eltern-Klassen.
  • Um eine abgeleitete Klasse zu erstellen, verwenden wir bei der Klassendeklaration das Schlüsselwort extends
  • public class Unterklasse extends Basisklasse
  • Die Wurzel der Java Klassenhierarchie ist die Klasse Objekt
  • Eine Subklasse kann nur eine Superklasse haben. Mehrfachvererbung ist nicht möglich.
  • Mit dem Schlüsselwort super können wir in der Subklasse verwenden, um den Konstruktor oder die Methoden der Superklasse aufzurufen.

Beispiel einer Vererbung

Sehen wir uns die Klasse Bank.java an. Diese verfügt über Konstruktoren und 3 Methoden um Einzahlungen oder Auszahlungen vorzunehmen und den Kontostand auszugeben. Als Instanzvariablen haben wir einmal den Kontostand und den Besitzer des Bankkontos.

Klasse Bank


/**
 * Superklasse für Beispiel Vererbung
 * @author Markus Badzura
 */

public class Bank 
{
    protected double kontostand = 0.0;
    private String besitzer = "noname";
    
    Bank(){}
    
    /**
     * Konstruktor für die Eröffnung eines Kontos
     * @param einzahlungsbetrag Einzahlungsbetrag bei Kontoeröffnung
     * @param besitzer Verfügungsbevollmächtigter des Bankkontos
     */
    Bank(double einzahlungsbetrag, String besitzer)
    {
        kontostand = einzahlungsbetrag;
        this.besitzer = besitzer;
    }
    
    /**
     * Setter-Methode Einzahlung auf das Bankkonto
     * @param einzahlungsbetrag Double-Betrag der Einzahlung
     */
    public void setEinzahlung (double einzahlungsbetrag)
    {
        kontostand = kontostand + einzahlungsbetrag;
    }
    
    /**
     * Setter-Methode Auszahlung vom Bankkonto
     * @param auszahlungsbetrag Auszahlungsbetrag als Double-Wert
     */
    public void setAuszahlung (double auszahlungsbetrag)
    {
        kontostand = kontostand - auszahlungsbetrag;
    }
    
    /**
     * Getter-Methode Abfrage Kontostand
     * @return aktuellen Kontostand als Double-Wert
     */
    public double getKontostand()
    {
        return kontostand;
    }
}

Klasse Sparkonto

Neben einem normalen Bankkonto können wir auch ein Sparkonto haben. Im Gegensatz zu einem Bankkonto haben wir bei einem Sparkonto einen festen Zinssatz, können aber auch Einzahlungen und Auszahlungen vornehmen und uns den Kontostand anzeigen lassen.

Die Klasse Sparkonto.java wurde so erstellt, dass Sie ohne Vererbung arbeitet. Alles was rot umrandet ist, sind Passagen, die wir auch in unserem Programm Bank.java haben. Wenn wir nun dafür sorgen, dass Sparkonto.java eine Unterklasse von Bank.java wird, können wir viel Quelltext einsparen. Wandeln wir also unser Sparkonto.java nun Schritt für Schritt zu einer Subklasse um.

Subklasse Sparkonto

Klassendeklaration ändern


/**
 * Subklasse für Beispiel Vererbung
 * @author Markus Badzura
 */
public class Sparkonto extends Bank
{
Durch das Schlüsselwort extends und der Angabe der Klasse Bank, haben wir dafür gesorgt, dass die Klasse Sparkonto nun von der Klasse Bank abgeleitet ist.

Instanzvariablen

Die Variablen kontostand und besitzer sind bereits in der Superklasse deklariert. Durch die Vererbung ist eine Deklaration der Variablen in der Unterklasse überflüssig, da wir auf die Eigenschaften der Superklasse zugreifen. Deshalb können wir die Variablendeklaration für kontostand und besitzer löschen.

    private double zinsrate = 2.3;

Konstruktoren

Beim Bilden eines neuen Objektes der Klasse Sparkonto werden ebenfalls Besitzer und der Einzahlungsbetrag benötigt. Ergänzend wird der vereinbarte Zinssatz eingegeben.

An den Parametern des Konstrukors ändert sich in der Klasse Sparkonto nichts, allerdings im Konstruktorkörper greifen wir mit dem Schlüsselwort super auf den Konstruktor der Superklasse zu. Dieser Konstruktor benötigt allerdings nur besitzer und kontostand, so dass wir lediglich die Instanzvariable zinsrate noch im Konstruktor der Klasse Sparkonto bearbeiten müssen.

Der Aufruf des Konstrukors der Basisklasse/Superklasse mit dem Schlüsselwort super muss die erste Anweisung im Konstruktor der Subklasse sein.


    /**
     * Konstruktor für die Eröffnung eines Kontos
     * @param einzahlungsbetrag Einzahlungsbetrag bei Kontoeröffnung
     * @param besitzer Verfügungsbevollmächtigter des Bankkontos
     * @param zinsrate Zinsrate des Sparkontos
     */
    Sparkonto(double einzahlungsbetrag, String besitzer, double zinsrate)
    {
        super(einzahlungsbetrag, besitzer); // Konstruktor der Klasse Bank
        this.zinsrate = zinsrate;
    }

Methoden

Da die Methoden setEinzahlung, setAuszahlung und getKontostand bereits in der Superklasse vorhanden sind, wurden diese Methoden der Subklasse vererbt und können somit ersatzlos gelöscht werden.

Was überbleibt ist die Methode für die Verzinsung.

Da wir keinen Rückgabewert in dieser Methode haben, allerdings der Kontostand aus der Superklasse vererbt wurde, müssen wir beim Zugriff auf den Kontostand das Schlüsselwort super und die dazugehörigen getter- und setter-Methoden verwenden.

Um noch ein bisschen mehr Quellcode zu entfernen, werden wir in unserer Superklasse Bank den Zugriffsmodifizierer bei der Variablendeklaration kontostand von private auf protected ändern. Mit dem Zugriffsmodifizierer protected erreichen wir, dass eine in der Superklasse deklarierte Variable in sämtlichen von Bank.java abgeleiteten Unterklassen ebenfalls sichtbar ist. Dadurch sparen wir uns nochmals 2 Anweisungen in unserer Methode verzinsung().


    /**
     * Verzinsen des aktuellen Kontostandes
     */
    public void verzinsung()
    {   
          kontostand = kontostand + (kontostand * zinsrate/100);
    }
    
nach oben Java4Beginners -- Seitenversion 1.0 -- Stand: 2017-05-16