Witam, mam problem ze zrozumieniem działania programu. Mam pewne przypuszczenia, ale może najpierw kod:
class A { int x = 5; } class B extends A { int x = 6; } public class CovariantTest { public A getObject() { return new A(); } public static void main(String[]args) { CovariantTest c1 = new SubCovariantTest(); System.out.println(c1.getObject().x); } } class SubCovariantTest extends CovariantTest { public B getObject() { return new B(); } }
Wynikiem działania programu jest:
5
Wydawać by się mogło, że używając c1.getObject(), dostajemy obiekt klasy B (polimorfizm - wywołana zostaje przesłonięta metoda z obiektu klasy SubCovariantTest zwracająca new B()), więc odwołujemy się do zmiennej instancji x o wartości 6.
Natomiast wychodzi na to, że używając c1.getObject(), dostajemy obiekt klasy A, pomimo że używamy przesłoniętej metody, która powinna zwracać B. Dlatego wartość zmiennej x wynosi 5. Dlaczego wywołanie getObject() na obiekcie klasy SubCovariantTest daje w rezultacie obiekt klasy A?