Полиморфизъм в 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();
  }
}

Разлика между претоварване и замяна

Метод Претоварване
Отмяна на метода
Претоварването на метода е в един и същи клас, където повече от един метод имат едно и също име, но различни сигнатури. Отмяната на метода е, когато един от методите в супер класа е предефиниран в подкласа. В този случай сигнатурата на метода остава същата.
пр:

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

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() от подкласа – Хирург

Ако се използва препратка към базов клас за извикване на метод, методът, който ще бъде извикан, се решава от JVM, в зависимост от обекта, към който препратката сочи

Например, въпреки че obj е препратка към Doctor, той извиква метода на Surgeon, тъй като сочи към обект Surgeon

Това се решава по време на изпълнение и следователно се нарича термин динамичен or полиморфизъм по време на изпълнение

Разлика между статичен и динамичен полиморфизъм

Статичен полиморфизъм в Java е вид полиморфизъм, който събира информацията за извикване на метод по време на компилация, докато динамичният полиморфизъм е вид полиморфизъм, който събира информацията за извикване на метод по време на изпълнение.

Статичен полиморфизъм
Динамичен полиморфизъм
Свързано е с претоварване на метода. Отнася се до отмяна на метода.
Грешките, ако има такива, се разрешават по време на компилиране. Тъй като кодът не се изпълнява по време на компилация, оттук и името static.

пр:

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

В случай, че референтна променлива извиква отменен метод, методът, който ще бъде извикан, се определя от обекта, към който сочи вашата референтна променлива. Това може да се определи само по време на изпълнение, когато кодът е в процес на изпълнение, оттук и името динамичен.

пр:

//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) Грешка = ? Това е така, защото подкласът няма достъп до частни членове на супер класа.

Oбобщение

  • Полиморфизмът в обектно-ориентираното програмиране възниква, когато има един или повече класове или обекти, свързани един с друг чрез наследяване. Това е способността на един обект да приема много форми.
  • Замяната на метод е предефиниране на метод на супер клас в подклас.
  • Динамичен полиморфизъм в Java е механизмът, чрез който могат да бъдат дефинирани множество методи с едно и също име и сигнатура в суперкласа и подкласа.
  • Статичен полиморфизъм в Java е вид полиморфизъм, който събира информацията за извикване на метод по време на компилация, докато динамичният полиморфизъм е вид полиморфизъм, който събира информацията за извикване на метод по време на изпълнение.
  • Ключовата дума Super може да се използва за достъп до методите на родителския клас от дъщерния клас.