![](https://cdn.javarush.com/images/article/6a7886df-ee44-4ce3-8dba-ae52cdbb111a/1024.jpeg)
![](https://cdn.javarush.com/images/article/0537adde-ab10-48f1-ad94-45521bed7986/1024.jpeg)
![](https://cdn.javarush.com/images/article/0b0f0752-67bc-4c04-bf52-5131cdc3504e/512.jpeg)
![](https://cdn.javarush.com/images/article/daa065d2-b5bd-4236-8b95-c96b6c7b1345/512.jpeg)
![](https://cdn.javarush.com/images/article/b2f8a45f-6145-4c5b-9646-8d6a3c88f471/512.jpeg)
![](https://cdn.javarush.com/images/article/e32c0beb-a0c8-49da-93e4-49e1c9b9865a/512.jpeg)
1. Киты и коровы
Есть такой интересный зоологический факт: корова гораздо ближе к киту, чем, например, к бегемоту. Оказывается, коровы и киты — близкие родственники.
![](https://cdn.javarush.com/images/article/a774692e-ea30-4817-ad0a-a93ffae288bd/original.jpeg)
Так вот. Расскажем вам о еще одном очень мощном инструменте ООП — это полиморфизм. У него есть четыре особенности.
2. Наследование — не панацея
Представьте, что вы для игры написали класс Корова
. В нем есть много полей и методов. Объекты этого класса могут делать разные вещи: идти, есть, спать. Еще коровы звонят в колокольчик, когда ходят. Допустим, вы реализовали в классе все до мелочей.
А тут приходит заказчик проекта и говорит, что хочет выпустить новый уровень игры, где все действия происходят в море, а главным героем будет кит.
Вы начали проектировать класс Кит
и поняли, что он лишь немного отличается от класса Корова
. Логика работы обоих классов очень похожа, и вы решили использовать наследование.
![Полиморфизм в java](https://cdn.javarush.com/images/article/9b914360-d168-4c64-827a-0293d87d9a18/original.png)
Класс Корова
идеально подходит на роль класса-родителя: в нем есть все необходимые переменные и методы. Достаточно только добавить киту возможность плавать. Но есть проблема: у вашего кита есть ноги, рога и колокольчик. Ведь эта функциональность реализована внутри класса Корова
. Что тут можно сделать?
![Полиморфизм в java. Наследование](https://cdn.javarush.com/images/article/f38e1cdf-cffa-4b87-9c23-34716e60ca2d/original.png)
3. Переопределение метода
К нам на помощь приходит переопределение (замена) методов. Если мы унаследовали метод, который делает не совсем то, что нужно в нашем новом классе, мы можем заменить этот метод на другой.
![Переопределение метода](https://cdn.javarush.com/images/article/0008cb33-9724-4f16-b7f0-f0d61574b0a5/original.png)
Как же это делается? В нашем классе-потомке мы объявляем такой же метод, как и метод класса-родителя, который хотим изменить. Пишем в нем новый код. И все: как будто старого метода в классе-родителе и не было.
Вот как это работает:
Код | Описание |
---|---|
|
|
|
Данный код выведет на экран надпись:
|
|
Данный код выведет на экран:
|
После наследования класса Cow
и переопределения метода printName
, класс Whale
фактически содержит такие данные и методы:
|
Ни о каком старом методе мы и не знаем. |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ