Итак, я тестировал некоторые фрагменты кода, чтобы обмануть концепцию наследования, когда я наткнулся на это - для меня - странное явление.
Итак, сначала я тестировал этот простой код:
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, так как это тип)?