Что такое переопределение (overriding) метода в Java?

Если мы в нашем классе определяем метод с такой же сигнатурой, именем и возвращаемыми параметрами, что и в супер-классе — значит мы используем переопределение метода.  Никаких специальных слов добавлять не нужно, механизм работает автоматически при вызове метода.

Допустим у нас есть три класса: Dog,fox_size_comp Cat, Fox. Они наследуются от одного родителя с
названием Animal. В классе Animal есть метод say(), а классы-потомки переопределяют его. Затем мы садим животных в клетки и накрываем чёрной тканью. После этого мы можем подойти к любой клетке, качнуть её(не сильно) и попросить say(), зная лишь то, что внутри какое-то животное, но не зная какое точно. Мы получим именно тот звук, который переопределили в классе-потомке. Подробности в коде:

Видно, что не смотря на то что все потомки приводятся к супер-классу при помещении в коллекцию, всё равно вызывается именно метод потомка, а не заглушка из родителя.

Давайте рассмотрим возможности, немного выходящие за рамки вопроса. Как вызвать вариант переопределённого метода, но находящийся в суперклассе? Для этого перед вызовом метода нужно написать слово super.

Можно защитить метод от переопределения если добавить к нему модификатор final. В этом случае при переопределении пользователь кода получит ошибку компиляции, которая в консоли всё прекрасно ему объяснит:

Также нельзя переопределять приватные методы родителя. Если Вы создадите у потомка такой же приватный метод, как и у родителя — это не будет переопределением.

Ещё нам в помощь существует аннотация @Override, которая защищает нас от ошибки неправильно переопределить метод. Если мы пометили метод как @Override и ошиблись в каком либо месте(указали неправильную сигнатуру) — компилятор не пропустит нас.

 

Если Вас действительно заинтересовало, что же говорит лиса, можете послушать в видео:


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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *