Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Выполнив восходящее преобразование от производного в базовый класс метод не переопределился

Выполнив восходящее преобразование от производного в базовый класс метод не переопределился? Почему не вызвался метод 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 и соответственно происходит вызов функции исходя из типа созданного объекта а не связанной с ним переменной.

Комментариев нет:

Отправить комментарий