Подтвердить что ты не робот

Почему изменение типа приводит к разному использованию членов?

Итак, я тестировал некоторые фрагменты кода, чтобы обмануть концепцию наследования, когда я наткнулся на это - для меня - странное явление.

Итак, сначала я тестировал этот простой код:

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");
    }
}

И результат был таким, каким я ожидал:

age = 4
TEST BAR

Затем я сделал небольшое изменение в строке 3, где я изменил тип Bar на Foo следующим образом:

Foo bar = new Bar();

Теперь, когда я запускаю код, он дает мне вывод, который я считаю странным:

age = 2
TEST BAR

Как происходит, что код bar.age теперь использует член age класса Foo (что имеет смысл), а bar.test(); все еще использует метод класса Bar (а не от Foo, так как это тип)?

4b9b3361

Ответ 1

age в Bar затеняет age в Foo.

Кроме того, поля не полиморфны (см. функции).

Итак, когда вы пишете Foo bar = new Bar();, статический тип Bar используется при обращении к полю age, чтобы вернуть 2. И динамический тип Bar используется при выборе того, какое переопределение test() для вызова, и что тип Bar.

Ответ 2

Потому что вы определили два разных возрастных поля: по одному в каждом классе. Поля не перекрываются.