Файл: Направление Инфарматика срс по Практикум программирования по решению предметноориентированных задач на пк т Полиморфизм в Java.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.12.2023
Просмотров: 16
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство образования Кыргызской Республики
Кыргызский Государственный Университет им. И.Арабаева
Факультет «Физико-математического образования и информационных технологий»
Кафедра «Прикладная информатика»
Направление «Инфарматика»
СРС
По Практикум программирования по решению предметно-ориентированных задач на ПК
Т: Полиморфизм в 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)