Share This
Связаться со мной
Крути в низ
Categories
//ООП в Java: виды полиморфизма на простых примерах. Статический и динамический полиморфизм

ООП в Java: виды полиморфизма на простых примерах. Статический и динамический полиморфизм

oop v java vidy polimorfizma na prostyh primerah staticheskij i dinamicheskij polimorfizm 6764af6 - ООП в Java: виды полиморфизма на простых примерах. Статический и динамический полиморфизм

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

oop v java vidy polimorfizma na prostyh primerah staticheskij i dinamicheskij polimorfizm bb440c9 - ООП в Java: виды полиморфизма на простых примерах. Статический и динамический полиморфизм

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

Слово «полиморфизм» произошло от двух греческих слов: «Poly» означающего «многочисленный» и «Morph» — форма. Если перевести дословно – бесчисленное множество форм. Живые примеры этого явления можно встретить в земной коре, среди животных и рептилий, а также в других областях науки. Но речь сегодня не об этом, а об основной парадигме ООП, применяющейся во многих языках программирования.

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

Полиморфизм в ООП подразумевает собой особенность, при которой одно и то же действие выполняется разными способами. Или, проще говоря, такая концепция позволяет выполнять несколько реализаций одной и той же сущности.

Чаще всего она возникает при наличии другой парадигмы ООП — наследования, т. е. когда у нас существует множество классов, связанных друг с другом. Наследование позволяет одному классу приобретать свойства и атрибуты другого, а полиморфизм использует унаследованные свойства для выполнения различных задач.

Примеры из жизни

Чтобы лучше понять принцип парадигмы, попробуем объяснить это с помощью нескольких простых примеров.

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

А еще в организме человека есть разные органы и у каждого из них есть своя функция: сердце отвечает за кровоток, легкие за дыхание, мозг за когнитивную деятельность. То есть, у нас есть стандартная функция, работающая по-разному в зависимости от органа тела. Теперь перейдем конкретно к Java.

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека джависта» Интересно, перейти к каналу

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

Что мы должны понимать про принцип действия рассматриваемой концепции? Ну во-первых, все то, что содержит или обрабатывает значения различных типов, когда идет компиляция или выполняется программа — является полиморфным, например:

  • любая переменная, которой присваивается значение другого типа;
  • любой объект, обладающий свойствами, изменяющими тип данных присвоенного ему значения;
  • любая функция, принимающая аргументы различных типов.

Рассмотрим небольшой пример по реализации полиморфизма на Java:

У суперкласса под названием Forms есть метод shapearea() и классы-потомки Triang и Circ. Каждый из них имеет свой способ подсчета площади. С помощью рассматриваемой парадигмы потомки пользуются методом родителя shapearea(), чтобы найти формулу для расчета своей площади.

         class Forms {   public void shapearea() {     System.out.println("Формулы:");   } } class Triang extends Forms{   public void shapearea() {     System.out.println("Sтреугольника: ½ * основания * высоту");   } } class Circ extends Forms{   public void shapearea() {     System.out.println("Sкруга: 3,14 * радиус * радиус");   } } class Main {   public static void main(String[] args) {    Forms xForms = new Forms);  // создание объекта Forms    Forms xTriang= new Triang();  //  создание объекта Triang    Forms xCirc = new Circ();  // создание объекта Circ     xForms.shapearea();     xTriang.shapearea();     xForms.shapearea();     xCirc.shapearea();   } }      

Вывод:

         Формула: площадь треугольника: ½ * основания * высоту Формула: площадь круга: 3,14 * радиус * радиус     

Типы полиморфизма

Два варианта реализации полиморфизма в Java:

  1. Overloading – перегрузка метода
  2. Overriding – переопределение метода

При перегрузке метода мы в одном классе создаем нескольких методов с одинаковым названием, но разным функционалом, например:

         class Forms{   public void shapearea()) {     System.out.println("Площади фигур:");   } public void shapearea(int r) {     System.out.println("Sкруга = "+3.14*r*r);   } public void shapearea(double b, double h) {     System.out.println("Sтреугольника ="+0.5*b*h);   } public void shapearea(int l, int b) {     System.out.println("Sпрямоугольника ="+l*b);   } }   class Main {   public static void main(String[] args) {    Forms xForms = new Forms();             xForms.shapearea();     xForms.shapearea(3);     xForms.shapearea(2.5, 2.0);     xForms.shapearea(4,7);         } }      

Вывод:

         Площади фигур: Sкруга = 28.26 Sтреугольника = 5 Sпрямоугольника = 28     

При переопределении название метода дочернего класса мы ставим такое же, как и уже объявленного метода родительского класса, например:

         class Vehicles{     // определение метода   void drive(){ System.out.println("Управлять транспортным средством");}   }   //создаем дочерний класс class Cars extends Vehicles{     //определяем одноименный метод   void drive(){ System.out.println("Управлять автомобилем"); }        public static void main(String args[]){     Cars model= new Cars(); //создание нового объекта   model.drive(); //вызов переопределенного метода   }   }       

Выведет:

         Управлять автомобилем     

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

При статическом варианте развития событий метод можно вызывать при компиляции кода, происходит это при помощи рассмотренной нами ранее концепции — перегрузки методов. Говоря проще, у них будет одинаковое название, но разная функциональная начинка (тип возвращаемых данных, свойств и т. д.). В таком случае Java позволяет пользователю свободно определять функциям идентичные названия, если они будут отличны по типу и параметрам, например:

         public class Add {   void sum(int x, int y) {     int z = x + y;     System.out.println(“Сумма двух чисел: ”+z);   }   void sum(int x, int y, int i) {     int z = x + y + i;     System.out.println(“Сумма трех чисел: ”+z);   }   public static void main(String[] args) {     Add myAdd = new Add();     myAdd.sum(5, 11);     myAdd.sum(1, 8, 11);   } }     

Вывод программы:

         Сумма двух чисел: 16 Сумма трех чисел: 20     

При динамическом полиморфизме вызвать переопределеный метод можно при выполнении программы. Скопировать метод родительского класса и обозначить его в дочернем можно с помощью ссылочной переменной родительского класса, при этом вызванный метод будет определяться по объекту, на который она ссылается. Такую операцию еще называют Upcasting, например:

Создадим один родительский класс Звери и три подкласса: травоядные, плотоядные и всеядные. В этом случае классы-потомки расширили родителя и переопределили его метод eat().

         class Beast {   void eat() {     System.out.println("Животные питаются:”);     }   }   class herbivorous extends Beast {     void eat() {       System.out.println("Травоядные едят растения");     }   }   class omnivorous extends Beast {     void eat() {       System.out.println("Всеядные едят растения и мясо");     }   }   class carnivorous extends Beast {     void eat() {       System.out.println("Хищники едят только мясо");     }   }   class main {     public static void main(String args[]) {       Beast X = new Beast();       Beast herb = new herbivorous();       Beast omni = new omnivorous();       Beast carn = new carnivorous();       X.eat();       herb.eat();       omni.eat();       carn.eat();      }   }     

Вывод:

         Животные питаются: Травоядные едят растения Всеядные едят растения и мясо Хищники едят мясо     

Преимущества и недостатки полиморфизма

  1. Предоставляет возможность повторного использования кода. Реализованные классы можно многократно использовать повторно. Кроме того, это экономит много времени разработчику, ведь при этом появляется возможность поменять что-то в программе, не трогая исходный код.
  2. Одна переменная может использоваться для хранения нескольких значений данных. Значение переменной в дочернем классе, наследуемой от родительского, может быть изменено без изменения родительской переменной.
  3. Легче отлаживать код, когда его не так много.

Помимо преимуществ, у рассматриваемой парадигмы есть еще и несколько недостатков:

  1. Полиморфизм не так просто реализовать на деле.
  2. Такой подход снижает читаемость кода.
  3. Может вызывать серьезные проблемы с производительностью в режиме реального времени.

***

Мы надеемся, что у вас сложилось правильное общее представление о полиморфизме в Java и о том, как его использовать. С более подробной информации по теме можно ознакомиться на официальном сайте Oracle.

Материалы по теме

  • ☕ Программирование на Java с нуля: инструкция к профессии Java-разработчика
  • ☕ Основы Java: выделяем 4 разных роли классов
  • ☕ Основы Java за 30 минут: самоучитель для начинающих

  • 3 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

    Связаться со мной
    Close