Я прочитал ответы, и ни один из них (пока) не дал веских оснований, почему в объектно-ориентированном языке, как Java, это должно быть так. Я постараюсь объяснить.
Предположим, у вас есть функция, которая принимает Мать как arg:
void foo(Mother m) {
print(m.var);
}
Эта функция (фактически компилятор) понятия не имеет, вызовете ли вы ее с помощью Mother
, Daughter
или другой Dauther2
, в которой даже не объявлена переменная var
. Из-за этого, когда ссылка имеет тип Mother, ссылка на переменную-член должна быть связана (компилятором) с членом Mother
. То же самое относится и к функции , поэтому функции связаны с объявлением Матери из getVar()
, но не с Mother
* реализация из getVar()
Таким образом, переменные-члены всегда связаны (компилятором) на основе ссылки. Еще один способ объяснить это: если вы удалите Mother
var (и сделаете Mother getVar()
скомпилируемым), ваша second m.var
(когда m относится к Daughter) не скомпилирует даже Daughter
имеет член var.
Надеюсь, я был чист.