1. Киты и коровы

Есть такой интересный зоологический факт: корова гораздо ближе к киту, чем, например, к бегемоту. Оказывается, коровы и киты — близкие родственники.

Так вот. Расскажем вам о еще одном очень мощном инструменте ООП — это полиморфизм. У него есть четыре особенности.


2. Наследование — не панацея

Представьте, что вы для игры написали класс Корова. В нем есть много полей и методов. Объекты этого класса могут делать разные вещи: идти, есть, спать. Еще коровы звонят в колокольчик, когда ходят. Допустим, вы реализовали в классе все до мелочей.

А тут приходит заказчик проекта и говорит, что хочет выпустить новый уровень игры, где все действия происходят в море, а главным героем будет кит.

Вы начали проектировать класс Кит и поняли, что он лишь немного отличается от класса Корова. Логика работы обоих классов очень похожа, и вы решили использовать наследование.

Полиморфизм в java

Класс Корова идеально подходит на роль класса-родителя: в нем есть все необходимые переменные и методы. Достаточно только добавить киту возможность плавать. Но есть проблема: у вашего кита есть ноги, рога и колокольчик. Ведь эта функциональность реализована внутри класса Корова. Что тут можно сделать?

Полиморфизм в java. Наследование

3. Переопределение метода

К нам на помощь приходит переопределение (замена) методов. Если мы унаследовали метод, который делает не совсем то, что нужно в нашем новом классе, мы можем заменить этот метод на другой.

Переопределение метода

Как же это делается? В нашем классе-потомке мы объявляем такой же метод, как и метод класса-родителя, который хотим изменить. Пишем в нем новый код. И все: как будто старого метода в классе-родителе и не было.

Вот как это работает:

Код Описание
class Cow
{
   public void printColor ()
   {
      System.out.println("Я — белая");
   }

   public void printName()
   {
      System.out.println("Я — корова");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("Я — кит");
   }
}
  • Тут определены два класса — Cow и Whale
  • Whale унаследован от Cow
  • В классе Whale переопределен метод printName()
public static void main(String[] args)
{
   Cow cow = new Cow();
   cow.printName();
}
Данный код выведет на экран надпись:
Я — корова
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Данный код выведет на экран:
Я — кит

После наследования класса Cow и переопределения метода printName, класс Whale фактически содержит такие данные и методы:

class Whale
{
   public void printColor()
   {
      System.out.println("Я — белая");
   }

   public void printName()
   {
      System.out.println("Я — кит");
   }
}
Ни о каком старом методе мы и не знаем.