Casten (explizite Typumwandlung)
Wir erweitern die Klasse Katze
um eine Methode miaue
und die Klasse Hund
um eine Methode belle
:
Können wir diese Methoden mit Hilfe der Variable t
aufrufen?
Tier t; t = new Katze("Snoopy"); t.miaue(); // GEHT NICHT! t = new Hund("Bello"); t.belle(); // GEHT NICHT!
Obwohl die Variable t
zum Zeitpunkt des Aufrufes t.schnurre()
auf ein Katze
-Objekt zeigt, akzeptiert der Compiler diesen Aufruf nicht, denn die Deklaration Tier t
in der ersten Zeile sichert nur zu, dass t
auf ein Objekt der Klasse Tier
oder einer Unterklasse davon zeigt.
casten:
Aber wir wissen doch, dass beide Aufrufe in Ordnung sind. Können wir das dem Compiler nicht mitteilen?
Tier t; t = new Katze("Snoopy"); ((Katze)t).miaue(); // OK! t = new Hund("Bello"); ((Hund)t).belle(); // OK! ((Katze)t).miaue(); // Führt zur Laufzeit zu einem Fehler!
Durch den Zusatz (Hund)
vor der Variable t
teilen wir dem Compiler mit, dass er davon ausgehen darf, dass t
zur Laufzeit des Programms auf ein Objekt der Klasse Hund
zeigt. Kurzgesagt: Wir casten t
zum Typ Hund
.