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

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

Динамический полиморфизм в объектно-ориентированном программировании — это механизм, позволяющий определять несколько методов с одинаковым именем и сигнатурой как в суперклассе, так и в подклассе. Вызов переопределенного метода разрешается во время выполнения посредством динамического связывания внутри JVM.

Пример динамического полиморфизма

Переменная-ссылка суперкласса может ссылаться на объект подкласса:

 Doctor obj = new Surgeon();

Рассмотрим следующее утверждение:

obj.treatPatient();

Здесь используется эталонная переменная. об Объект принадлежит родительскому классу, но объект, на который он указывает, принадлежит дочернему классу, как показано на диаграмме полиморфизма.

Вызов obj.treatPatient() Выполнится метод treatPatient() подкласса Surgeon. Когда для вызова метода используется ссылка на базовый класс, JVM определяет, какой именно метод будет вызван, исходя из фактического объекта, на который указывает ссылка. Даже несмотря на это об Это ссылка на объект 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) Ошибка = ? Это происходит потому, что подкласс не может получить доступ к закрытым членам суперкласса.

Часто задаваемые вопросы (FAQ)

Полиморфизм в Java Это способность объекта принимать множество форм. Одно и то же имя метода может выполнять разный код в зависимости от того, на какой объект подкласса ссылаются во время выполнения, что является основной особенностью объектно-ориентированного программирования.

Java Поддерживается полиморфизм на этапе компиляции посредством перегрузки методов и полиморфизм на этапе выполнения посредством переопределения методов. Перегрузка разрешается на этапе компиляции через статическую привязку, а переопределение — на этапе выполнения через динамическую привязку, обрабатываемую JVM.

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

Ключевое слово `super` позволяет подклассу вызывать переопределенный метод или получать доступ к члену данных из родительского класса. Это позволяет дочернему классу повторно использовать логику родительского класса, а затем накладывать на нее специализированное поведение.

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

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

Подведем итог этой публикации следующим образом: