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

⚡ Умно обобщение

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

  • 🎭 Много форми, едно име: Полиморфизъм в Java позволява на едно и също име на метод да се изпраща към различни имплементации въз основа на действителния тип обект по време на изпълнение.
  • 🔀 Два вкуса: Полиморфизмът по време на компилация използва претоварване на методи, докато полиморфизмът по време на изпълнение използва заместване на методи чрез наследяване и JVM.
  • Статично срещу динамично свързване: Претоварените повиквания се разрешават по време на компилация чрез статично обвързване, докато презаписаните повиквания се разрешават по време на изпълнение чрез динамично обвързване.
  • Суперсила на ключовите думи: Ключовата дума super позволява на подклас да извика родителската имплементация, преди да добави свое собствено специализирано поведение отгоре.
  • 🧪 Обхват в реалния свят: Банковите сметки, йерархиите на болничния персонал и двигателите за рендиране на форми разчитат на полиморфизъм, за да създават нови изисквания, без да нарушават тествания код.

Полиморфизъм в Java

Какво представлява полиморфизмът в Java?

Полиморфизъм в Java възниква, когато един или повече класове или обекти са свързани помежду си чрез наследяване. Това е способността на даден обект да приема много форми. Наследяването позволява на потребителите да наследяват атрибути и методи, а полиморфизмът използва тези методи за изпълнение на различни задачи. Целта е комуникация, докато подходът може да се различава.

Например, смартфон се използва за комуникация. Режимът на комуникация може да бъде обаждане, текстово съобщение, картинно съобщение или имейл. Целта е обща, а именно комуникация, но подходът е различен. Това поведение е същността на... полиморфизъмСега ще научим полиморфизма в Java с примерен код, диаграми и подробни обяснения.

Кликнете тук ако видеото не е достъпно

Защо да използваме полиморфизъм в Java?

Полиморфизъм в Java се използва, защото прави кода гъвкав, многократно използваем и по-лесен за поддръжка. Една референтна променлива от родителски тип може да сочи към няколко дъщерни обекта, така че едно и също извикване се адаптира към предоставения подклас. Този модел запазва тествания код недокоснат, докато се добавя ново поведение чрез специализирани подкласове, което е точно причината, поради която рамки като Spring и Jakarta EE зависят от него.

Java Полиморфизъм в ООП с пример

Да разгледаме един родителски клас с име Акаунт с функции за депозиране и теглене. Класът Account има два дъщерни класа. Операцията по депозиране и теглене е еднаква за спестовните и разплащателните сметки, така че наследените методи от класа Account ще работят.

Единично наследяване в Java

Java Пример за полиморфизъм

Промяна в софтуерните изисквания

Има промяна в спецификацията на изискванията, нещо, което е често срещано в софтуерната индустрия. Трябва да се добави функционалност за привилегирована банкова сметка с овърдрафт. Овърдрафтът е услуга, при която клиентът може да тегли сума, по-голяма от наличния баланс по сметката. Методът за теглене за привилегированата сметка се нуждае от нова имплементация, докато тестваният код в спестовните и разплащателните сметки остава непроменен. Тази изолация е предимството на... OOPS.

Java полиморфизъм

Стъпка 1) Когато се извика методът за изтегляне за спестовната сметка, се изпълнява методът, дефиниран в родителския клас Account.

Java полиморфизъм

Стъпка 2) Когато се извика методът за изтегляне за привилегированата сметка (овърдрафт), се изпълнява методът за изтегляне, дефиниран в привилегирования клас. Това изпращане е Полиморфизъм в обектно-ориентираните програми (ООП).

Java полиморфизъм

Замяна на метода в Java

Преопределянето на метод е процес на предефиниране на метод на суперклас вътре в подклас. Подкласът запазва същата функционалност.tract, но предоставя нова имплементация, която се избира при изпълнение на програмата.

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

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

Правила за замяна на метод в 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
 }
}

Какво е динамичен полиморфизъм?

Динамичният полиморфизъм в обектно-ориентираните програми (OOP) е механизмът, чрез който множество методи могат да бъдат дефинирани с едно и също име и сигнатура в суперкласа и подкласа. Извикването на презаписан метод се разрешава по време на изпълнение чрез динамично обвързване вътре в JVM.

Пример за динамичен полиморфизъм

Референтна променлива на суперкласа може да се отнася до обект на подклас:

 Doctor obj = new Surgeon();

Обмислете твърдението:

obj.treatPatient();

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

Повикването обект.treatPatient() ще изпълни метода treatPatient() на подкласа Surgeon. Когато се използва препратка към базов клас за извикване на метод, методът, който се извиква, се определя от JVM въз основа на действителния обект, към който сочи препратката. Въпреки че OBJ е препратка към Doctor, извиква метода на Surgeon, защото сочи към обект Surgeon. Решението се взема по време на изпълнение, поради което се нарича Динамичен полиморфизъм или полиморфизъм по време на изпълнение.

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

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

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

пр:

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 с примерни програми.

Пример: Да се ​​изучат наследяването, полиморфизмът и ключовата дума super

Стъпка 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(){
            // overridden 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 е способността на даден обект да приема много форми. Едно и също име на метод може да изпълнява различен код в зависимост от това кой обект от подклас е посочен по време на изпълнение, което е основното поведение на обектно-ориентирано програмиране (OOP).

Java Поддържа полиморфизъм по време на компилация чрез претоварване на методи (Method Overloading) и полиморфизъм по време на изпълнение (Runtime-Time Polimorphism) чрез пренареждане на методи (Method Overriding). Претоварването се разрешава по време на компилация чрез статично свързване, докато пренареждането се разрешава по време на изпълнение чрез динамично свързване, обработвано от JVM.

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

Ключовата дума super позволява на подклас да извика презаписан метод или да получи достъп до член с данни от родителския си клас. Това позволява на детето да използва повторно родителската логика и след това да наслои специализирано поведение върху нея.

ИИ преподаватели като ChatGPT и GitHub Copilot Chat могат да обяснят полиморфизма в Java с персонализирани аналогии, генерирайте практически задачи, разходете се през дърветата на наследяване и проверявайте учащите за статично спрямо динамично свързване за по-бързо овладяване.

Да. Асистенти за рефакториране, управлявани от изкуствен интелект, като Cursor, Sourcegraph Cody и IntelliJ AI Assistant, могат да откриват дублирани условни изрази, да предлагат йерархии от класове и да пренаписват наследени кодове. Java код, така че преодоляването на метода да замества повтарящите се if-else вериги.

Обобщете тази публикация с: