2017-12-05 127 views
17

Więc testowałem z niektórymi fragmentami kodu, aby objąć moją głowę pojęciem dziedziczenia, gdy natknąłem się na to - dla mnie - dziwne zjawisko.Dlaczego zmiana typu prowadzi do innego użycia członków?

więc najpierw testował ten prosty kod:

public class Main{ 
    public static void main(String[] args) { 
     Bar bar = new Bar(); 

     System.out.println("age = " + bar.age); 

     bar.test(); 
    } 
} 

class Foo{ 
    int age = 2; 

    void test(){ 
     System.out.println("TEST FOO"); 
    } 
} 

class Bar extends Foo{ 
    int age = 4; 

    void test(){ 
     System.out.println("TEST BAR"); 
    } 
} 

a wyjście było jak się spodziewałem:

age = 4 
TEST BAR 

Potem zrobiłem małą zmianę do linii 3, w którym zmieniłem typ Bar do Foo tak:

Foo bar = new Bar(); 

teraz gdy uruchamiam dorsza e, to daje mi wyjście wierzę jest dziwne:

age = 2 
TEST BAR 

Jak to się dzieje, że kod bar.age jest teraz za pomocą członu age klasy Foo (co ma sens), natomiast bar.test(); nadal wykorzystuje metodę klasa Bar (a nie z Foo, ponieważ taki jest typ)?

+2

https://stackoverflow.com/questions/12589274/slight-confusion-regioning-overriding-where-variables-are-con-eded lub https://stackoverflow.com/questions/10722110/overriding-member-variables-in -java –

+0

@RC. Interesujące lektury tego szukały. Dzięki. – moffeltje

+1

Oprócz aspektu technicznego: robi to ** nie ** OOP, ponieważ narusza najważniejszą zasadę OO: * ukrywanie informacji/enkapsulacja *. –

Odpowiedz

22

W age w Barcienieage w Foo.

Ponadto, pola są nie polimorficzne (patrz funkcje).

Więc kiedy piszesz Foo bar = new Bar();, rodzaj barstatyczny jest wykorzystywany przy dostępie do pola age, aby powrócić 2. I typ bardynamiczny jest stosowany przy podejmowaniu decyzji, które ominięcie test() zadzwonić, a to typ Bar.

+0

Rozumiem, że wypisuje "wiek = 2". Ale nadal nie rozumiem, dlaczego nazywa się 'Bar.test();' while jest op typu 'Foo'. – moffeltje

+0

@moffeltje: dodano to. Funkcja jest polimorficzna. – Bathsheba

4

Ponieważ zdefiniowano dwa różne pola wiekowe, po jednym w każdej klasie. Pola nie są zastępowane.