Hey,
Wieso wird hier zweimal "Miau Miau" ausgegeben? Die erste Ausgabe sollte doch "Fauch" sein, da Hauskatze h in Katze gecastet wird.
[CODE lang="java" highlight="23"]public class Katze {
private String name ;
public Katze ( String name ) {
this. name = name ;
}
public String miezmiez () {
return " Fauch !";
}
}
public class Hauskatze extends Katze {
private String name ;
public Hauskatze ( String name ) {
super( name );
}
public String miezmiez () {
return " Miau Miau ";
}
}
public class Tierfreund {
public static void main ( String [] args ) {
Hauskatze h = new Hauskatze (" Schnurri ");
Katze k = new Katze (" Garfield ");
System . out . println ((( Katze )h). miezmiez ());
k = h;
System . out . println ((( Hauskatze )k). miezmiez ());
}
}[/CODE]
Entscheidend ist nicht der statische Compilezeittyp des Ausdrucks, sondern der Laufzeittyp des Objektes, zu dem der Ausdruck auswertet.
Der statische Compilezeittyp des Ausdrucks (Katze)h ist zwar Katze, aber die Variable h enthält ja weiterhin eine Hauskatze als Instanz. Und nicht-statische Methodenaufrufe (wie eben für die Instanzmethode `miezmiez()`) werden immer bezogen auf den Laufzeittyp des Objektes dispatched.
Casts verändern also immer nur den statischen Typ bzw. Compilezeittyp eines Ausdrucks (um z.B. dem Compiler per Downcast zu sagen, dass du genau weisst, dass zur Laufzeit ein Objekt einen bestimmten Typ haben wird), aber niemals den Laufzeittyp eines Objektes.
Entscheidend ist nicht der statische Compilezeittyp des Ausdrucks, sondern der Laufzeittyp des Objektes, zu dem der Ausdruck auswertet.
Der statische Compilezeittyp des Ausdrucks (Katze)h ist zwar Katze, aber die Variable h enthält ja weiterhin eine Hauskatze als Instanz. Und nicht-statische Methodenaufrufe (wie eben für die Instanzmethode `miezmiez()`) werden immer bezogen auf den Laufzeittyp des Objektes dispatched.
Casts verändern also immer nur den statischen Typ bzw. Compilezeittyp eines Ausdrucks (um z.B. dem Compiler per Downcast zu sagen, dass du genau weisst, dass zur Laufzeit ein Objekt einen bestimmten Typ haben wird), aber niemals den Laufzeittyp eines Objektes.
Perfekt, danke dir.
Wird in Zeile 25 einfach nur die Referenz übergeben oder muss man da auf irgendwas achten. Mein Prof meinte das h der dynamische Typ von k ist. Aber eigentlich wird doch einfach nur die Referenz übergeben.
k = h ist eine Zuweisung, die die aktuell in der Variablen h gespeicherte Objektreferenz an die Variable k zuweist. Beide Variablen enthalten danach also dieselbe Referenz auf dasselbe Objekt. h ist nicht der dynamische Typ von k. Beides sind Variablen. Eine Variable hat keinen dynamischen Typ. Ein Objekt bzw. eine Instanz, die zu einem gegebenen Zeitpunkt in einer Variablen gespeichert ist, hat einen dynamischen Typ bzw. Laufzeittyp.
Nehmen wir mal an, man würde dich zu einem Objekt vom Typ "Mensch" casten: Dann wärst du doch trotzdem immer noch derselbe TimoN11 und würdest genauso auf Anfragen reagieren wie sonst auch, oder?
Man könnte dich zwar nur so ansprechen wie jedes andere Objekt vom Typ Mensch, und würde Spezialmethoden, die nur du allein bereitstellst, nicht benutzen können. Aber du würdest doch genauso verhalten wie sonst auch.
Und bei Objekten und Klassen in Java verhält es sich genauso.