Programmieren Tutorium 12

Vererbung

Gliederung

  • Vererbungsbeziehung
  • Vererbung in Java

Vererbungsbeziehung

Vererbung (inheritance, subtyping)

  • Mechanismus zur Implementierung von
    • Generalisierung bzw.
    • Spezialisierung von Typen/Klassen
  • Modellierung einer „is-a“-Beziehung

Terminologie

  • Unterklasse (subclass): die speziellere Klasse
    • auch abgeleitete Klasse (derived class) oder Kindklasse (child class)
  • Oberklasse (superclass): die generellere Klasse
    • auch Basisklasse (base class) oder Elternklasse (parent class)

Beispiel

Vererbungsbeispiel

Vererbung in Java

extends

public class Animal {...}
public class Mammal extends Animal {...}

Unterklasse erbt fast alle Merkmale der Oberklasse

  • Attribute
  • Methoden
  • Geschachtelte Klassen (nested classes)
  • Keine Vererbung von Konstruktoren

Überschreiben von Methoden

class Animal {
    void escape() { ... }
}
class Bird extends Animal {
    @Override
    void escape() { flyAway(); }
}
class Penguin extends Bird {
    @Override
    void escape() { dive(); }
}
  • gleicher Methodenname
  • gleiche Parameteranzahl und -typen
  • Rückgabetyp: Subtyp oder gleich
  • Annotation @Override

Dynamische Bindung

Penguin p = new Penguin();
Bird b1 = new Bird();
Bird b2 = p;

p.escape();
b1.escape();
b2.escape();

Welche Implementierung wird jeweils verwendet?

Penguin, Bird, Penguin

Bindung von obj.m(...) erst zur Laufzeit. Wichtig ist Typ des referenzierten Objekts, nicht Typ der Variablen obj

super

class Bird extends Animal {
    @Override
    void escape() { flyAway(); }
}
class Chicken extends Bird {
    @Override
    void escape() {
        cluck();
        super.escape()
    }
}
  • super bezieht sich auf die Oberklasse
    • Analog zu this
  • bietet Zugriff auf Methoden und Attribute der Oberklasse
    • Vorscht: nicht grundsätzlich nötig!

Konstruktoren

  • Konstruktoren werden nicht vererbt
  • Default-Konstruktor:
    • public Something() { super(); }
  • In jedem Konstruktor wird zunächst ein Konstruktor der Oberklasse aufgerufen
    • Wird super(...) nicht explizit aufgerufen, so wird von Java implizit super() ausgeführt
    • Dafür muss die Oberklasse einen Konstruktor ohne Parameter besitzen

Abstrakte Klassen

abstract class Animal {
    boolean isAlive = true;
    abstract void escape();
}
class Bird extends Animal {
    @Override
    void escape() { flyAway(); }
}
  • Werden benutzt wenn keine Instanz der Klasse erzeugt werden soll

protected

public abstract class Animal {
    protected int age;
}

Wie package-private, aber zusätzlich in allen Unterklassen sichtbar

instanceof und Casts

Animal pluto = new Dog();

if (pluto instanceof Dog) {
    Dog someDog = (Dog) pluto;
}
  • instanceof prüft ob ein Objekt Instanz einer Klasse ist
    • Ergebnis auch true für alle Kindklassen
  • Expliziter Casts nur bei Down-Cast nötig

final

Neu im Zusammenhang mit Vererbung:

  • Klasse: Keine Unterklassen möglich
    • Gründe: Sicherheit, Performanz
  • Methode: Kein Überschreiben möglich
    • Verhalten fixiert

Object

  • Object ist die Wurzel der Klassenhierarchie
  • Somit ist Object Oberklasse jeder anderen Klasse
  • Einige Methoden in Object:
    • equals(Object obj)
    • toString()
    • clone()

Übung

baldur.ira.uka.de/programmieren-ws1213/blatt05-1.0.pdf
Aufgabe A.2

Feierabend!

http://xkcd.com/1174/