Vererbung und Automatische Typumwandlung bei Vererbung

Ähnlich zu primitiven Datentypen gilt für Objekte die automatische und erzwungene Typumwandlung.

class Person {
    void f() {
        System.out.println("Person");
    }
}

class Mitarbeiter extends Person {
    void f() {
        System.out.println("Mitarbeiter");
    }
}

class Kunde extends Mitarbeiter {
    // nichts weiter...
}

Person p1 = new Person();  // Person hier nicht abstract, also OK!
Person p2 = new Mitarbeiter();
Person p3 = new Kunde();

p1.f();  // "Person", da Instanz von Klasse Person
p2.f();  // "Mitarbeiter", da Instanz von Mitarbeiter, welche f() überschrieben hat
p3.f();  // "Person", da zwar Instanz von Kunde, f() aber nicht überschrieben

Die Brille Person für die Referenzvariablen p{1,2,3} stimmt also (man kann nur aufrufen, was in Person definiert ist), es gilt aber trotzdem die Überschreibung, da ja im Speicher trotzdem jeweils eine Instanz von Person, Mitarbeiter oder Kunde liegt (immer die Klasse welche bei new genannt wird).

Ein anderes Beispiel, die toString Methode. Diese wird von Object ererbt, und ist somit in allen Klassen verfügbar. Die Implementierung in Object ist sehr einfach gehalten: Sie gibt den Klassennamen sowie einen Hashwert der Speicheradresse zurück.

class Student extends Person {
    public String toString() {
        return "Student";
    }
}

Person p4 = new Student();

String s1 = p1.toString();  // "Person@7f31245a", da von Object
String s2 = p2.toString();  // "Mitarbeiter@42fs324", da von Object
String s4 = p4.toString();  // "Student", da in Student überschrieben

Es gilt also: Wird eine Methode in der Unterklasse überschrieben, so wird genau diese auch ausgeführt. Das heisst aber auch im Umkehrschluss, dass die “originale” toString nicht mehr erreichbar ist (im Gegensatz zu anderen Sprachen wie z.B. C++).

Written on March 1, 2017