Переопределение методов Java

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Данная статья:


Привет! Это статья про переопределение (override) методов в Java. Она тесно связана с пониманием принципов ООП, классов и механизма наследования. Если Вы плохо разбираетесь в этих темах, сначала почитайте:

Что такое переопределение в Java

Итак, Вы уже знакомы с понятиями классов и методов в Java. Наверняка Вам даже известно, что одни классы могут наследовать другие.

И вот в этот момент - момент наследования - может возникнуть проблема. Чтобы проиллюстрировать, представим, что у нас есть класс Animal. Этот класс имеет несколько методов - в том числе и метод voice() ("голос"):

Давайте теперь представим, что мы создаем класс Cat, который наследует Animal:

Но сейчас если мы создадим кошку и запустим метод voice() , мы получим "This is my voice!".  Например, если запустим это:

Получаем:

Как мы знаем, кошка не говорит "This is my voice!" 🙂 Кошка мяукает, собака лает, и т.д.

Таким образом, мы хотели бы, чтобы при вызове метода voice() наша кошка говорила "Мяу".  Конечно, мы можем создать новый метод - например, catVoice(), - но это было бы не очень эффективно. Что, если мы хотим изменить 3, 5 или 10 методов? И что, метод родителя будет лежать у нас мертвым грузом?

Нет, нам совершенно не обязательно идти этим путем. Гораздо лучше, если мы просто будем иметь "свой вариант" нужного метода. Мы можем сделать так, чтобы нам не надо было менять название или параметры метода, но он вызвал нужный нам результат. Для этого мы просто должны переопределить метод родителя.

Пример

Как нам переопределить метод voice()? Все очень просто:

  • Во-первых, мы заново прописываем метод voice() в нашем классе Cat
  • Во-вторых, мы должны дать Java понять, что мы не ошиблись и не назвали метод названием, которое уже есть, из-за невнимательности. Чтобы сказать, что мы знаем, что делаем и действительно хотим переопределить (по англ. "override") метод, нужно над методом написать @Override.

В коде, например, это выглядит так:

Отлично!

Теперь, если мы опять запустим тот же самый main():

Получим нужный результат:

Теперь наша кошка мяукает - а это значит, что мы вызываем уже не метод родителя, а переопределенный метод из дочернего класса.

Если бы мы таким же образом создали и другие классы, которые наследуют Animal - например, Dog и Cow, мы точно так же могли бы в них переопределить метод родителя:

Наследование переопределенного метода

Кстати, если мы создадим наследник класса Cat, он тоже будет видеть переопределенный метод (тот, что говорит "Meow"), а не метод родителя Animal. Например:

Вызовем на объекте класса Persian метод voice():

Получаем:

Вот, собственно, и все, что Вам нужно знать чтобы переопределять методы в Java.

На что стоит обратить внимание

1. Переопределение (override) - это способ поддержания полиморфизма в Java. Помните, Вы в начале учили принципы ООП? Так вот, переопределение - это наглядный пример применения принципа полиморфизма.

2. Не стоит путать переопределение и перегрузку методов. И то и то позволяет нам создать разные методы с одинаковыми названиями. Но:

  • переопределение происходит, когда "первая строчка" метода (сигнатура) у исходного метода и у "нового" метода одинаковая. То-есть и название, и возвращаемый тип, и принимаемый тип не меняются.
  • Если же что-то из этого меняется (т.е. меняется сигнатура) - мы уже имеем дело с перегрузкой.

3. Слово, которое мы пишем перед нашим "новым" методом (@Override) называется аннотацией. В Java существует много разных аннотаций - подробнее мы их рассмотрим позже.


Надеемся, что наша статья была Вам полезна.  Можно записаться к нам на курсы по Java на сайте.

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr
Самоучители--узнать детальнее--