Учебники

32) Полиморфизм

Что такое полиморфизм?

Полиморфизм — это концепция ООП, в которой одно имя может иметь много форм.

Например, у вас есть смартфон для общения. Режим связи, который вы выбираете, может быть любым. Это может быть звонок, текстовое сообщение, графическое сообщение, почта и т. Д. Итак, общая цель — общение, но у них другой подход. Это называется полиморфизмом.

В этом уроке вы узнаете

Нажмите здесь, если видео не доступно

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

У нас есть один родительский класс, «Счет» с функцией пополнения и снятия. Учетная запись имеет 2 дочерних класса

Операции ввода и вывода одинаковы для Сберегательного и Чекового счетов. Таким образом, унаследованные методы из класса Account будут работать.

Наследование 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» относится к родительскому классу, но объект, на который она указывает, принадлежит к дочернему классу (как показано на диаграмме).

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

obj.treatPatient () выполнит метод TreatPatient () для подкласса — Surgeon

Если для вызова метода используется ссылка на базовый класс, то вызываемый метод определяется JVM в зависимости от объекта, на который указывает ссылка

Например, хотя obj является ссылкой на Doctor, он вызывает метод Surgeon, так как он указывает на объект Surgeon.

Это определяется во время выполнения и, следовательно, называется динамическим или динамическим полиморфизмом.

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

Что, если метод TreatPatient в классе Surgeon хочет выполнить функциональность, определенную в классе Doctor, а затем выполнить свою собственную специфическую функциональность?

В этом случае ключевое слово superможет использоваться для доступа к методам родительского класса из дочернего класса.

Метод TreatPatient в классе Surgeon может быть записан как:

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

Ключевое слово 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(){
            // 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) Ошибка =? Это потому, что подкласс не может получить доступ к закрытым членам суперкласса.
 

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

Статический Полиморфизм
Динамический Полиморфизм
Это относится к перегрузке метода. Это относится к переопределению метода.

Ошибки, если таковые имеются, устраняются во время компиляции. Поскольку код не выполняется во время компиляции, отсюда и название 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();