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




class inheritance (2)

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

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

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

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, так как это тип)?


age в Bar скрывает age в Foo .

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

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







member