Hallo,
eine etwas kompliziert zu erklärende Frage, die uns bei der Klausurvorbereitung gekommen ist.
Gegeben sind folgende Klassen:
public class A
{
public int p;
public B q;
public A(B q)
{
this.q = q;
p = 5;
}
}
public class B
{
public int r;
public String s;
public void f()
{
System.out.println(s);
}
}
public class C extends B
{
public double t;
public void f()
{
System.out.println(s+ ", " + t);
}
}
public class Tester {
public static void main(String[] args)
{
C v = new C();
v.r = 4;
v.s = "Maus";
v.t = 3.4;
v.f();
B w = v;
w.f();//???
C x = (C) v;
x.f();
w = new B();
w.r = 5;
w.s = "Hase";
w.f();
w = null;
x = null;
A y = new A(v);
v = new C();
v.r = 5;
v.s = "Schlange";
v.t = 7.4;
}
}
Die Frage betrifft den Aufruf der Methode f() auf dem Objekt w. (Zeile markiert mit drei Fragezeichen im Kommentar). Diese Methode erzeugt ebenfalls die Ausgabe "Maus, 3.4". Wegen der Polymorphie wird die Methode f() der Klasse C aufgerufen, soweit so klar.
Aber: nach unseren Wissen kann man über ein Referenz auf eine Vaterklasse nicht Attribute zugreifen, die in der Sohnklasse hinzugefügt wurden (hier double t). Dies passiert aber in diesem Fall, wenn auch indirekt über die überschriebene Methode f.
Wird hier intern ein expliziter Downcast durchgeführt, oder was ist der Grund das dies funktioniert?
Ich hoffe es verständlich erklärt zu haben.
Danke für eure Hilfe
Bene