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