Файл: Направление Инфарматика срс по Практикум программирования по решению предметноориентированных задач на пк т Полиморфизм в Java.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.12.2023

Просмотров: 16

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Министерство образования Кыргызской Республики

Кыргызский Государственный Университет им. И.Арабаева

Факультет «Физико-математического образования и информационных технологий»

Кафедра «Прикладная информатика»

Направление «Инфарматика»

СРС

По Практикум программирования по решению предметно-ориентированных задач на ПК

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

Выполнила студентка гр: ФМО-И-15-20 Талантбекова Т.Т.

Проверил: Барганалиева Ж.К.

Бишкек 2023г.

ПОЛИМОРФИЗМ В JAVA

План:

Введение

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

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

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

  4. Полиморфизм в java

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

  6. Динамический полиморфизм

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

  8. Оператор Java instanceof

Литература

ВВЕДЕНИЕ

Полиморфизм – это способность объекта использоваться в качестве объекта другого типа. Он определяется как способность одного метода или функции иметь несколько реализаций.

Термин «полиморфизм» происходит от греческого слова «πολύμορφος» (poly - много, morphē - форма), что означает «многоформность». В ООП термин «полиморфизм» обозначает понятие, в соответствии с которым объекты одного класса могут иметь различную форму и область применения.

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

Цель данного СРС – изучить понятие полиморфизма в Java, рассмотреть его различные виды и способы реализации.




  1. ЧТО ТАКОЕ ПОЛИМОРФИЗМ?

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

  1. ЧТО ТАКОЕ ПОЛИМОРФИЗМ В ПРОГРАММИРОВАНИИ?

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

  1. ПРИМЕРЫ ИЗ ЖИЗНИ

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

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

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

  1. ПОЛИМОРФИЗМ В 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, когда метод, объявленный в родительском классе, может быть переопределен в наследниках и работать по-разному в зависимости от типа объекта.


  1. ТИПЫ ПОЛИМОРФИЗМА

Два варианта реализации полиморфизма в 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("Управлять транспортным средством");}

}

Вывод:

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

  1. ДИНАМИЧЕСКИЙ ПОЛИМОРФИЗМ

При динамическом полиморфизме вызвать переопределеный метод можно при выполнении программы. Скопировать метод родительского класса и обозначить его в дочернем можно с помощью ссылочной переменной родительского класса, при этом вызванный метод будет определяться по объекту, на который она ссылается. Такую операцию еще называют 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. ПРЕИМУЩЕСТВА И НЕДОСТАТКИ ПОЛИМОРФИЗМА

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

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

  • Легче отлаживать код, когда его не так много.

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

  • Полиморфизм не так просто реализовать на деле.

  • Такой подход снижает читаемость кода.

  • Может вызывать серьезные проблемы с производительностью в режиме реального времени.




  1. ОПЕРАТОР 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)