Поліморфізм в Java (Статичний і динамічний)

Що таке поліморфізм Java?

Поліморфізм in Java виникає, коли є один або більше класів або об'єктів, пов'язаних один з одним шляхом успадкування. Це здатність об’єкта приймати багато форм. Спадкування дозволяє користувачам успадковувати атрибути та методи, а поліморфізм використовує ці методи для виконання різних завдань. Отже, мета – спілкування, але підхід інший.

Наприклад, у вас є смартфон для спілкування. Режим спілкування, який ви виберете, може бути будь-яким. Це може бути дзвінок, текстове повідомлення, графічне повідомлення, лист тощо. Отже, мета спільна, тобто спілкування, але підхід у них різний. Це називається Поліморфізм. Тепер ми вивчатимемо поліморфізм у Java з прикладом.

Натисніть тут якщо відео недоступне

Java Поліморфізм в ООП із прикладом

У нас є один батьківський клас, «Рахунок» з функцією депозиту та зняття коштів. В обліковому записі є 2 дочірніх класи. Операція внесення та зняття коштів однакова для ощадних і чекових рахунків. Тож успадковані методи з класу Account працюватимуть.

Єдина спадщина в Java
Java Приклад поліморфізму

Зміна вимог до програмного забезпечення

Відбулися зміни в специфікації вимог, що так часто зустрічається в індустрії програмного забезпечення. Ви повинні додати функціональність привілейованого банківського рахунку з овердрафтом. Для довідки, овердрафт – це можливість зняти суму, яка перевищує наявний баланс на вашому рахунку. Отже, метод вилучення для привілейованих потреб реалізовано заново. Але ви не змінюєте перевірений фрагмент коду в ощадному та поточному рахунку. Це перевага OOPS

Java Поліморфізм

Крок 1) Таким чином, коли викликається «вилучений» метод для збереження облікового запису, виконується метод із класу батьківського облікового запису

Java Поліморфізм

Крок 2) Але коли викликається метод «Вилучення» для привілейованого рахунку (можливість овердрафту), виконується метод зняття, визначений у привілейованому класі. Це Поліморфізм в ООП.

Java Поліморфізм

Перевизначення методу в Java

Перевизначення методу — це перевизначення методу суперкласу в підкласі.

Правила перевизначення методів

  • Сигнатура методу, тобто назва методу, список параметрів і тип повернення мають точно збігатися.
  • Перевизначений метод може розширити доступність, але не звузити її, тобто якщо він приватний у базовому класі, дочірній клас може зробити його публічним, але не навпаки.

Правила перевизначення методу в Java

Приклад

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
Class run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor()
	// treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient  method in class Surgeon  will be executed
    surgeonObj.treatPatient();
  }
}

Різниця між перевантаженням і перевизначенням

Метод Перевантаження
Заміна методу
Перевантаження методів відбувається в одному класі, де кілька методів мають однакову назву, але різні підписи. Перевизначення методу відбувається, коли один із методів суперкласу перевизначається у підкласі. У цьому випадку сигнатура методу залишається незмінною.
Ex:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
Ex:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
   //signature is same
 }
}

Що таке динамічний поліморфізм?

Динамічний поліморфізм в ООП — це механізм, за допомогою якого в суперкласі та підкласі можна визначити кілька методів з однаковою назвою та підписом. Виклик перевизначеного методу вирішується під час виконання.

Приклад динамічного поліморфізму:

Посилальна змінна суперкласу може посилатися на об’єкт підкласу

 Doctor obj = new Surgeon();

Розгляньте твердження

obj.treatPatient();

Тут посилання на змінну «obj» відноситься до батьківського класу, але об’єкт, на який вона вказує, належить до дочірнього класу (як показано на прикладі поліморфізму нижче).

obj.treatPatient() виконає метод treatPatient() підкласу – Surgeon

Якщо для виклику методу використовується посилання на базовий клас, JVM визначає метод, який потрібно викликати, залежно від об’єкта, на який вказує посилання.

Наприклад, хоча obj є посиланням на Doctor, він викликає метод Surgeon, оскільки вказує на об’єкт Surgeon

Це вирішується під час виконання і, отже, називається терміном динамічний or поліморфізм під час виконання

Різниця між статичним і динамічним поліморфізмом

Статичний поліморфізм в Java — це тип поліморфізму, який збирає інформацію для виклику методу під час компіляції, тоді як динамічний поліморфізм — це тип поліморфізму, який збирає інформацію для виклику методу під час виконання.

Статичний поліморфізм
Динамічний поліморфізм
Це стосується перевантаження методу. Це стосується перевизначення методу.
Помилки, якщо такі є, вирішуються під час компіляції. Оскільки код не виконується під час компіляції, звідси й назва static.

Ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.

Якщо посилальна змінна викликає перевизначений метод, метод, який потрібно викликати, визначається об’єктом, на який вказує ваша посилальна змінна. Це можна визначити лише під час виконання, коли код виконується, звідси й назва динамічний.

Ex:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Супер Ключове слово в Java

Що робити, якщо метод treatPatient у класі Surgeon хоче виконати функціональні можливості, визначені в класі Doctor, а потім виконати власну специфічну функціональність? У цьому випадку ключове слово superможе використовуватися для доступу до методів батьківського класу з дочірнього класу. Метод treatPatient у класі Surgeon можна записати так:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

Ключове слово super можна використовувати для доступу до будь-якого елемента даних або методів суперкласу в підкласі.

Далі ми дізнаємося про ключове слово Super, Спадкування і поліморфізм в Java з прикладами програм.

Приклад:-Щоб вивчити успадкування, поліморфізм і суперключове слово

Крок 1) Скопіюйте наступний код у редактор

public class Test{
     public static void main(String args[]){
        X x= new X();
       Y y = new  Y();
       y.m2();
      //x.m1();
      //y.m1();
     //x = y;// parent pointing to object of child
     //x.m1() ;
     //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overriden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

Крок 2) Збережіть, скомпілюйте та запустіть код. Спостерігайте за результатом.

Крок 3) Розкоментуйте рядки № 6-9. Збережіть, скомпілюйте та запустіть код. Спостерігайте за результатом.

Крок 4) Розкоментуйте рядок № 10. Збережіть і скомпілюйте код.

Крок 5) Помилка = ? Це тому, що підклас не може отримати доступ до приватних членів суперкласу.

Підсумки

  • Поліморфізм в об'єктно-орієнтованому програмуванні виникає, коли існує один або більше класів або об'єктів, пов'язаних один з одним шляхом успадкування. Це здатність об’єкта приймати багато форм.
  • Перевизначення методу — це перевизначення методу суперкласу в підкласі.
  • Динамічний поліморфізм в Java це механізм, за допомогою якого можна визначити кілька методів з однаковим іменем і підписом у суперкласі та підкласі.
  • Статичний поліморфізм в Java — це тип поліморфізму, який збирає інформацію для виклику методу під час компіляції, тоді як динамічний поліморфізм — це тип поліморфізму, який збирає інформацію для виклику методу під час виконання.
  • Ключове слово super можна використовувати для доступу до методів батьківського класу з дочірнього класу.