Выполнив восходящее преобразование от производного в базовый класс метод не переопределился? Почему не вызвался метод nasvai() базового класса?
class BasicClass {
void nasvai() { System.out.println("Basic_Nasvai"); }
}
class SubBasic extends BasicClass {
@Override
void nasvai() { System.out.println("Nasvai"); }
}
class P231Exc20 {
public static void main (String[] args) {
SubBasic sb = new SubBasic();
sb.nasvai();
BasicClass bc = sb;
bc.nasvai();
}
}
Вывод:
Nasvai
Nasvai
Ответ
А он и не должен был переопределяться. В Java (в отличии от С++ к примеру) все функции делаются виртуальными (virtual) и для поиска функции, которую необходимо вызвать, используется специальная таблица (VMT) которая (упрощённо) каждому объекту при создании ставит в соответствие его тип (по конструктору). И исходя из типа вызывает нужную функцию. При преобразовании типа сохраняется запись в VMT и соответственно происходит вызов функции исходя из типа созданного объекта а не связанной с ним переменной.
Комментариев нет:
Отправить комментарий