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

17

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

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

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

    
задан moffeltje 05.12.2017 в 12:46
источник
  • stackoverflow.com/questions/12589274/... или stackoverflow.com/questions/10722110/... –  stackoverflow.com/questions/10722110/… 05.12.2017 в 12:50
  • @RC. Интересные чтения, это искали. Благодарю. –  moffeltje 05.12.2017 в 13:08
  • Помимо технического аспекта: это не ООП, поскольку он нарушает важнейший принцип ОО: скрытие информации / инкапсуляция. –  Timothy Truckle 05.12.2017 в 13:09

2 ответа

22

age в Bar тени age в Foo .

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

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

    
ответ дан Bathsheba 05.12.2017 в 12:49
  • Я понимаю, что он печатает возраст = 2. Но потом я все еще не понимаю, почему он вызывает Bar.test (); в то время как это op типа Foo. –  moffeltje 05.12.2017 в 13:15
  • @moffeltje: добавил, что. Функция полиморфна. –  Bathsheba 05.12.2017 в 13:17
4

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

    
ответ дан Maurice Perry 05.12.2017 в 12:50