Полиморфизм
TRANSCRIPT
![Page 2: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/2.jpg)
Полиморфизм
Слово «полиморфизм» греческого происхождения и
означает «Имеющий много форм»
![Page 3: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/3.jpg)
![Page 4: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/4.jpg)
Полиморфизм определения
1.Способность объектов одного типа вести себя подобно объектам другого типа.
2.Способность функции обрабатывать данные разных типов.
![Page 5: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/5.jpg)
Полиморфизм определения
3. Возможность работать с несколькими типами так, как будто это один и тот же тип.
4. Возможность применения одноимённых методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования.
![Page 6: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/6.jpg)
Фигура
КвадратТреугол
ьник
Круг
Полиморфизм фигур
![Page 7: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/7.jpg)
Полиморфизм фигур
Shape s = new Circle();
![Page 8: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/8.jpg)
Динамический полиморфизм
В Java выполняется вызов метода данного объекта с учётом того, что объект может быть не того же класса, что и ссылка, указывающая на него. Т.е. выполняется вызов метода того класса, к которому реально относится объект.
![Page 9: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/9.jpg)
Динамический полиморфизм
Динамический полиморфизм методов так же называют поздним связыванием (dynamic binding, late binding, run-time binding).
![Page 10: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/10.jpg)
Абстрактный класс
Абстрактный класс – это класс, экземпляр которого невозможно создать.
Такой класс может только служить базовым классом при наследовании.
![Page 11: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/11.jpg)
Абстрактный класс
Нельзя объявлять абстрактные конструкторы или абстрактные статические методы. Некоторые или все члены этого класса могут оставаться нереализованными, их реализацию должен обеспечить класс потомок.
![Page 12: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/12.jpg)
Абстрактный класс
Абстрактный класс может содержать абстрактные методы.
![Page 13: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/13.jpg)
Абстрактный класс - abstract
public abstract class Animal(){ String getName() { return name; }}
![Page 14: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/14.jpg)
Абстрактные методы
Абстрактным называется метод, который не имеет реализации в данном классе. После круглых скобок, где перечислены его аргументы, ставится не открывающая фигурная скобка, чтобы начать блок описания метода, а точка с запятой. Тело метода отсутствует.
![Page 15: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/15.jpg)
Абстрактные методы
Перед именем метода указывается модификатор abstract.
![Page 16: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/16.jpg)
Абстрактный метод.
public abstract class Animal(){ String getName() { return name; } abstract void sound();}
![Page 17: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/17.jpg)
Пример
class A { void m1(A a) { System.out.print("A"); }}
class B extends A { void m1(B b) { System.out.print("B"); }}
class C extends B { void m1(B c) { System.out.print("C"); }}
class D { public static void main(String[] args) { A c1 = new C(); c1.m1(new B()); }}
![Page 18: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/18.jpg)
Интерфейс
Интерфейс - это конструкция языка программирования Java, в рамках которой могут описываться только абстрактные публичные (abstract public) методы и статические и/или константные свойства (final static).
![Page 19: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/19.jpg)
Интерфейс
Интерфейс - это отделение интерфейса класса от его реализации. Мы можем разделить интерфейс класса на три части: открытую (public) - видимую всем клиентам; защищённую (protected) - видимую самому классу, его подклассам и друзьям (friends); закрытую (private) - видимую только самому классу и его друзьям.
![Page 20: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/20.jpg)
Интерфейс
public interface Sounding{ public void sound();}
![Page 21: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/21.jpg)
Реализация интерфейса
Каждый класс в Java может реализовать любой набор интерфейсов.
public class Triangle implements Drawable, Colorable { }
![Page 22: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/22.jpg)
Полиморфизм интерфейсов
Интерфейсы описывают методы, которые должны быть реализованы в классе, и типы параметров, которые должен получать и возвращать каждый член класса, но не содержат определенной реализации методов, оставляя это реализующему интерфейс классу.
![Page 23: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/23.jpg)
Полиморфизм интерфейсов
Интерфейсы находятся вне иерархии наследования классов, поэтому они исключают определение метода или набора методов из иерархии наследования.
![Page 24: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/24.jpg)
Интерфейс как решение множественного наследования.
В отличие от C++, Java не позволяет наследовать больше одного класса. В качестве альтернативы множественному наследованию существуют интерфейсы.
![Page 25: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/25.jpg)
![Page 26: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/26.jpg)
Расширение интерфейса другими интерфейсами.
public interface Drawable extends Colorable, Resizable { }
![Page 27: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/27.jpg)
Интерфейсы и переменные
public interface Directions { int RIGHT=1; int LEFT=2; int UP=3; int DOWN=4; }
![Page 28: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/28.jpg)
Реализация интерфейса
interface Sounding { public String sound(); }public class Cat implements Sounding{ public String sound() { return “Мяу” }}
![Page 29: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/29.jpg)
Полиморфизм наследования
При наследовании класс получает все методы, свойства и события базового класса такими, какими они реализованы в базовом классе. При необходимости в наследуемых классах можно определять дополнительные члены или переопределять члены, доставшиеся от базового класса, чтобы реализовать их иначе. Наследуемый класс также может реализовывать интерфейсы.
![Page 30: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/30.jpg)
Полиморфизм методов
Способность классов поддерживать различные реализации методов с одинаковыми именами. Право выбора специфической версии метода предоставлено компилятору. Отдельным вариантом полиморфизма методов является полиморфизм методов с переменным числом аргументов
![Page 31: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/31.jpg)
Перегрузка методов
Переопределение методов (Overloading) — один из способов поддержки полиморфизма в Java. class Cat {void sound(String string)void sound(int value)}
![Page 32: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/32.jpg)
Позднее связывание
Способность Java делать выбор метода, исходя из типа объекта
во время вы- полнения, называется поздним
связыванием.
![Page 33: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/33.jpg)
Полиморфизм через динамическое определение типов (RTTI)
Java позволяет узнать точный тип объекта, когда у вас есть ссылка только на базовый тип. Для этого в Java встроено безопасное преобразование типов (type-safe downcast). Синтаксис безопасного преобразования типов: Cat myCat = (Cat) myAnimal;
![Page 34: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/34.jpg)
Полиморфизм через переопределение методов
Если перегруженные методы с одинаковыми именами находятся в одном классе, списки параметров должны отличаться. Но если метод подкласса совпадает с методом суперкласса, то метод подкласса переопределяет метод суперкласса. Совпадать при этом должны и имена методов и типы входных и выходных параметров
![Page 35: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/35.jpg)
Перегрузка и переопределение
![Page 36: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/36.jpg)
Полиморфизм представлений
Частичное решение проблемы полиморфизма представлений, в java решается с помощью "копирующих" конструкторов, создающие новый экземпляр коллекции из элементов существующего набора, быть может, отличающегося реализацией.
![Page 37: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/37.jpg)
Статический метод класса
Статическим методом называется фрагмент программы, которому присвоено некоторое уникальное имя, и который по этому имени можно вызывать из остальных частей программы.Math.cos()
![Page 38: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/38.jpg)
Отличие статического и обычного метода класса
Статические методы отмечаются модификатором static.
В статическом методе нельзя использовать нестатические свойства и методы класса.
Статический метод можно вызвать без создания экземпляра класса (если он имеет модификатор доступа public)
![Page 39: Полиморфизм](https://reader035.vdocuments.site/reader035/viewer/2022070518/58e49d601a28aba3458b557d/html5/thumbnails/39.jpg)
Модификатор strictfp
Ключевое слово strictfp появилось в Java 2 и связано с вычислениями с плавающей точкой. Модифицируя класс, метод, интерфейс с ключевым словом strictfp, вы гарантируете, что вычисления с плавающей точкой будут выполняться как в старых версиях Java. Для Android это не актуально. Вам не придётся иметь с ним дело.