Переопределение методов Java
Данная статья:
- написана командой Vertex Academy.
- это одна из статей из нашего "Самоучителя по Java"
Привет! Это статья про переопределение (override) методов в Java. Она тесно связана с пониманием принципов ООП, классов и механизма наследования. Если Вы плохо разбираетесь в этих темах, сначала почитайте:
Что такое переопределение в Java
Итак, Вы уже знакомы с понятиями классов и методов в Java. Наверняка Вам даже известно, что одни классы могут наследовать другие.
И вот в этот момент - момент наследования - может возникнуть проблема. Чтобы проиллюстрировать, представим, что у нас есть класс Animal. Этот класс имеет несколько методов - в том числе и метод voice() ("голос"):
1 2 3 4 5 6 |
public class Animal { // ... void voice() { System.out.println("This is my voice!"); } } |
Давайте теперь представим, что мы создаем класс Cat, который наследует Animal:
1 2 3 |
public class Cat extends Animal { // ... } |
Но сейчас если мы создадим кошку и запустим метод voice() , мы получим "This is my voice!". Например, если запустим это:
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { Cat MyCat = new Cat(); MyCat.voice(); } } |
Получаем:
Как мы знаем, кошка не говорит "This is my voice!" 🙂 Кошка мяукает, собака лает, и т.д.
Таким образом, мы хотели бы, чтобы при вызове метода voice() наша кошка говорила "Мяу". Конечно, мы можем создать новый метод - например, catVoice(), - но это было бы не очень эффективно. Что, если мы хотим изменить 3, 5 или 10 методов? И что, метод родителя будет лежать у нас мертвым грузом?
Нет, нам совершенно не обязательно идти этим путем. Гораздо лучше, если мы просто будем иметь "свой вариант" нужного метода. Мы можем сделать так, чтобы нам не надо было менять название или параметры метода, но он вызвал нужный нам результат. Для этого мы просто должны переопределить метод родителя.
Пример
Как нам переопределить метод voice()? Все очень просто:
- Во-первых, мы заново прописываем метод voice() в нашем классе Cat
- Во-вторых, мы должны дать Java понять, что мы не ошиблись и не назвали метод названием, которое уже есть, из-за невнимательности. Чтобы сказать, что мы знаем, что делаем и действительно хотим переопределить (по англ. "override") метод, нужно над методом написать @Override.
В коде, например, это выглядит так:
1 2 3 4 5 6 7 |
public class Cat extends Animal { @Override void voice() { System.out.println("Meow"); } } |
Отлично!
Теперь, если мы опять запустим тот же самый main():
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { Cat myCat = new Cat(); myCat.voice(); } } |
Получим нужный результат:
Теперь наша кошка мяукает - а это значит, что мы вызываем уже не метод родителя, а переопределенный метод из дочернего класса.
Если бы мы таким же образом создали и другие классы, которые наследуют Animal - например, Dog и Cow, мы точно так же могли бы в них переопределить метод родителя:
Наследование переопределенного метода
Кстати, если мы создадим наследник класса Cat, он тоже будет видеть переопределенный метод (тот, что говорит "Meow"), а не метод родителя Animal. Например:
1 2 |
public class Persian extends Cat { } |
Вызовем на объекте класса Persian метод voice():
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { Persian myCat = new Persian(); myCat.voice(); } } |
Получаем:
Вот, собственно, и все, что Вам нужно знать чтобы переопределять методы в Java.
На что стоит обратить внимание
1. Переопределение (override) - это способ поддержания полиморфизма в Java. Помните, Вы в начале учили принципы ООП? Так вот, переопределение - это наглядный пример применения принципа полиморфизма.
2. Не стоит путать переопределение и перегрузку методов. И то и то позволяет нам создать разные методы с одинаковыми названиями. Но:
- переопределение происходит, когда "первая строчка" метода (сигнатура) у исходного метода и у "нового" метода одинаковая. То-есть и название, и возвращаемый тип, и принимаемый тип не меняются.
- Если же что-то из этого меняется (т.е. меняется сигнатура) - мы уже имеем дело с перегрузкой.
3. Слово, которое мы пишем перед нашим "новым" методом (@Override) называется аннотацией. В Java существует много разных аннотаций - подробнее мы их рассмотрим позже.
Надеемся, что наша статья была Вам полезна. Можно записаться к нам на курсы по Java на сайте.