Почему изменение типа приводит к разному использованию членов?
Итак, я тестировал некоторые фрагменты кода, чтобы обмануть концепцию наследования, когда я наткнулся на это - для меня - странное явление.
Итак, сначала я тестировал этот простой код:
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, так как это тип)?
Ответы
Ответ 1
age
в Bar
затеняет age
в Foo
.
Кроме того, поля не полиморфны (см. функции).
Итак, когда вы пишете Foo bar = new Bar();
, статический тип Bar
используется при обращении к полю age
, чтобы вернуть 2. И динамический тип Bar
используется при выборе того, какое переопределение test()
для вызова, и что тип Bar
.
Ответ 2
Потому что вы определили два разных возрастных поля: по одному в каждом классе. Поля не перекрываются.