#java #наследование
Выполнив восходящее преобразование от производного в базовый класс метод не переопределился? Почему не вызвался метод 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
Ответы
Ответ 1
А он и не должен был переопределяться. В Java (в отличии от С++ к примеру) все функции делаются виртуальными (virtual) и для поиска функции, которую необходимо вызвать, используется специальная таблица (VMT) которая (упрощённо) каждому объекту при создании ставит в соответствие его тип (по конструктору). И исходя из типа вызывает нужную функцию. При преобразовании типа сохраняется запись в VMT и соответственно происходит вызов функции исходя из типа созданного объекта а не связанной с ним переменной.Ответ 2
Если коротко - "потому что полиморфизм". Так работает наследование в джаве. Более того, определив class BasicClass { public BasicClass() { nasvai(); } void nasvai() { System.out.println("Basic_Nasvai"); } } и создав экземпляр дочернего класса, вы увидите, что будет вызван переопределённый метод. Поэтому не вызыввайте не-static не-final методы в конструкторе во избежание недоразумений.
Комментариев нет:
Отправить комментарий