Полиморфизм в жава. срс.java. Направление Инфарматика срс по Практикум программирования по решению предметноориентированных задач на пк т Полиморфизм в Java
Скачать 234.35 Kb.
|
Министерство образования Кыргызской Республики Кыргызский Государственный Университет им. И.Арабаева Факультет «Физико-математического образования и информационных технологий» Кафедра «Прикладная информатика» Направление «Инфарматика» СРС По Практикум программирования по решению предметно-ориентированных задач на ПК Т: Полиморфизм в Java Выполнила студентка гр: ФМО-И-15-20 Талантбекова Т.Т. Проверил: Барганалиева Ж.К. Бишкек 2023г. ПОЛИМОРФИЗМ В JAVA План: Введение Что такое полиморфизм? Что такое полиморфизм в программировании? Примеры из жизни Полиморфизм в java Типы полиморфизма Динамический полиморфизм Преимущества и недостатки полиморфизма Оператор Java instanceof Литература ВВЕДЕНИЕ Полиморфизм – это способность объекта использоваться в качестве объекта другого типа. Он определяется как способность одного метода или функции иметь несколько реализаций. Термин «полиморфизм» происходит от греческого слова «πολύμορφος» (poly - много, morphē - форма), что означает «многоформность». В ООП термин «полиморфизм» обозначает понятие, в соответствии с которым объекты одного класса могут иметь различную форму и область применения. Полиморфизм – это один из основных принципов ООП, который позволяет программистам писать более гибкий и модульный код, упрощает проектирование, экономит время и уменьшает количество ошибок в программном коде. Цель данного СРС – изучить понятие полиморфизма в Java, рассмотреть его различные виды и способы реализации. ЧТО ТАКОЕ ПОЛИМОРФИЗМ? Слово «полиморфизм» произошло от двух греческих слов: «Poly» означающего «многочисленный» и «Morph» — форма. Если перевести дословно – бесчисленное множество форм. Живые примеры этого явления можно встретить в земной коре, среди животных и рептилий, а также в других областях науки. Но речь сегодня не об этом, а об основной парадигме ООП, применяющейся во многих языках программирования. ЧТО ТАКОЕ ПОЛИМОРФИЗМ В ПРОГРАММИРОВАНИИ? Полиморфизм в ООП подразумевает собой особенность, при которой одно и то же действие выполняется разными способами. Или, проще говоря, такая концепция позволяет выполнять несколько реализаций одной и той же сущности. Чаще всего она возникает при наличии другой парадигмы ООП — наследования, т. е. когда у нас существует множество классов, связанных друг с другом. Наследование позволяет одному классу приобретать свойства и атрибуты другого, а полиморфизм использует унаследованные свойства для выполнения различных задач. ПРИМЕРЫ ИЗ ЖИЗНИ Чтобы лучше понять принцип парадигмы, попробуем объяснить это с помощью нескольких простых примеров. Возьмем нас с вами или если совсем обобщенно — человека. Он, в зависимости от различных обстоятельств, может вести себя по-разному. Например, женщина может быть и матерью, и дочерью, и сестрой, и другом одновременно и в разных ситуациях ее действия будут радикально отличаться. А еще в организме человека есть разные органы и у каждого из них есть своя функция: сердце отвечает за кровоток, легкие за дыхание, мозг за когнитивную деятельность. То есть, у нас есть стандартная функция, работающая по-разному в зависимости от органа тела. Теперь перейдем конкретно к Java. ПОЛИМОРФИЗМ В JAVA Что мы должны понимать про принцип действия рассматриваемой концепции? Ну во-первых, все то, что содержит или обрабатывает значения различных типов, когда идет компиляция или выполняется программа — является полиморфным, например: любая переменная, которой присваивается значение другого типа; любой объект, обладающий свойствами, изменяющими тип данных присвоенного ему значения; любая функция, принимающая аргументы различных типов. Рассмотрим небольшой пример по реализации полиморфизма на Java: Пусть у нас есть класс Animal, который имеет метод eat(): public class Animal { public void eat() { System.out.println("Animal is eating..."); } } Теперь допустим, у нас есть несколько наследников класса Animal: Dog и Cat. И каждый из них по разному ест. Для этого мы можем перегрузить метод eat() у каждого из наследников: public class Dog extends Animal { @Override public void eat() { System.out.println("Dog is eating bones..."); } } public class Cat extends Animal { @Override public void eat() { System.out.println("Cat is eating fish..."); } } Теперь, если мы создадим объекты Dog и Cat, и вызовем у них метод eat(), то в зависимости от того, какой объект мы вызываем, будет выводиться соответствующее сообщение: Animal animal = new Animal(); Dog dog = new Dog(); Cat cat = new Cat(); animal.eat(); // "Animal is eating..." dog.eat(); // "Dog is eating bones..." cat.eat(); // "Cat is eating fish..." Вывод: Animal is eating... Dog is eating bones... Cat is eating fish... Это и есть пример полиморфизма в Java, когда метод, объявленный в родительском классе, может быть переопределен в наследниках и работать по-разному в зависимости от типа объекта. ТИПЫ ПОЛИМОРФИЗМА Два варианта реализации полиморфизма в Java: Overloading – перегрузка метода 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 Main { public static void main(String[] args) { Cars model = new Cars(); //создание нового объекта model.drive(); //вызов переопределенного метода } } //создаем дочерний класс class Cars extends Vehicles { //определяем одноименный метод void drive() { System.out.println("Управлять автомобилем"); } } class Vehicles{ // определение метода void drive(){ System.out.println("Управлять транспортным средством");} } Вывод: Управлять автомобилем ДИНАМИЧЕСКИЙ ПОЛИМОРФИЗМ При динамическом полиморфизме вызвать переопределеный метод можно при выполнении программы. Скопировать метод родительского класса и обозначить его в дочернем можно с помощью ссылочной переменной родительского класса, при этом вызванный метод будет определяться по объекту, на который она ссылается. Такую операцию еще называют 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(); } } Вывод: Животные питаются: Травоядные едят растения Всеядные едят растения и мясо Хищники едят мясо ПРЕИМУЩЕСТВА И НЕДОСТАТКИ ПОЛИМОРФИЗМА Предоставляет возможность повторного использования кода. Реализованные классы можно многократно использовать повторно. Кроме того, это экономит много времени разработчику, ведь при этом появляется возможность поменять что-то в программе, не трогая исходный код. Одна переменная может использоваться для хранения нескольких значений данных. Значение переменной в дочернем классе, наследуемой от родительского, может быть изменено без изменения родительской переменной. Легче отлаживать код, когда его не так много. Помимо преимуществ, у рассматриваемой парадигмы есть еще и несколько недостатков: Полиморфизм не так просто реализовать на деле. Такой подход снижает читаемость кода. Может вызывать серьезные проблемы с производительностью в режиме реального времени. ОПЕРАТОР JAVA INSTANCEOF instanceof - это двоичный оператор, который мы используем для проверки, относится ли объект к заданному типу. Результатом операции является либо истина, либо ложь. Он также известен как оператор сравнения типов, потому что он сравнивает экземпляр с типом. Перед приведением к неизвестному объекту всегда следует использовать проверку instanceof. Это помогает избежать исключения ClassCastException во время выполнения. Основной синтаксис оператора instanceof таков: (object) instanceof (type) Следовательно, чаще всего он встречается в разного рода проверочных условиях (if…else). Начнем с примеров попроще: public class Main { public static void main(String[] args) { Integer x = new Integer(22); System.out.println(x instanceof Integer); } } Как думаешь, что будет выведено в консоль? Ну, здесь это очевидно :) Объект х является Integer, поэтому результатом будет true. Вывод в консоль: true Теперь давай попробуем рассмотреть примеры посложнее. Раз уж мы упомянули наследование, поработаем вот с такой небольшой системой классов: public class Animal { } public class Cat extends Animal { } public class MaineCoon extends Cat { } Мы уже знаем, как ведет себя instanceof, когда мы проверяем принадлежность объекта к какому-то классу в обычной ситуации, но что будет, если мы добавим сюда отношение «родитель-потомок»? public class Main { public static void main(String[] args) { Cat cat = new Cat(); System.out.println(cat instanceof Animal); System.out.println(cat instanceof MaineCoon); } } Вывод: true false Главный вопрос, на который нужно ответить, — как именно instanceof расшифровывает понятие «объект создан на основе класса»? У нас в результате получилось Сat instanceof Animal == true, но ведь к такой формулировке можно и придраться. Почему это объект Cat создается на основе класса Animal? Разве он не создается только на основе собственного класса. Ответ достаточно прост, и ты, возможно, уже додумался до него. ЛИТЕРАТУРА Оператор Java instanceof | Baeldung (turbopages.org) Оператор Instanceof java, как работает? (javarush.com) ООП в Java: виды полиморфизма на простых примерах. Статический и динамический полиморфизм (proglib.io) |