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("Я — кит");
   }
}
Ні про який старий метод ми навіть і не знаємо.