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

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

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

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

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

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

У нас есть один родительский класс, 'Account' с функцией депозита и снятия. Account имеет 2 дочерних класса. Операция депозита и снятия одинакова для счетов Saving и Checking. Поэтому унаследованные методы из класса 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() подкласса – Surgeon

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

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

Резюме

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