Что такое полиморфизм
Полиморфизм — данный термин происходит с древнегреческого и означает «поли» — множество, «морфос» — формы. В данном случае полиморфизм означает множество форм. Полиморфизм это одна из базовых основ объектно-ориентированного программирования. Что такое ООП (объектно-ориентированное программирование) можно прочитать тут.
Полиморфизм в Java
Полиморфизм в Java представлен комплексно. Существует две формы полиморфизма: времени компиляции или времени выполнения. Также синтаксис языка поддерживает перегрузку и возможность переписать методы.
Java полиморфизм предусматривает множественную реализацию одного из интерфейсов. Код может работать совсем по-другому, хотя в общем будет применен один стандарт его описания — интерфейс.
Полиморфизм Java пример
Полиморфизм пример простой реализации.
class Phone {
public void call() {
makeCall(); // make call
}
private void makeCall() {
System.out.println("make abstract call");
}
}
class LandLine extends Phone {
public void call() {
System.out.println("====Land line====");
verifyLine(); // verify wire line
findSubscriber(); // find subscriber by the phone number
makeCall(); // make call by wire line
}
private void verifyLine() {
System.out.println("verify wire line");
}
private void findSubscriber() {
System.out.println("find subscriber by the phone number");
}
private void makeCall() {
System.out.println("make call by wire line");
}
}
class CellPhone extends Phone {
public void call() {
System.out.println("====Cell phone====");
verifyCellNetwork(); // verify cell network
findSubscriber(); // find subscriber in the network
makeCall(); // make cell call
}
private void verifyCellNetwork() {
System.out.println("verify cell network");
}
private void findSubscriber() {
System.out.println("find subscriber in the network");
}
private void makeCall() {
System.out.println("make cell call");
}
}
class Main {
public static void main(String[] args) {
Phone landLine = new LandLine();
Phone cellPhone = new CellPhone();
landLine.call();
cellPhone.call();
}
}
Вывод будет примерно таким:
====Land line====
verify wire line
find subscriber by the phone number
make call by wire line
====Cell phone====
verify cell network
find subscriber in the network
make cell call
Типы полиморфизма
Полиморфизм и программирование в Java вплотную связано с двумя типами методов: перегруженными и переписанными.
Перегрузка методов в Java
В данном примере показано, как вызывая метод с одним и тем же названием можно получить разные реализации. В нашем случае в зависимости от предоставленных параметров будет выполняться псевотрисовка элемента на полотне(точка, круг, треугольник или прямоугольник).
class Canvas {
public void draw() {
System.out.println("Draw dot");
}
public void draw(int radius) {
System.out.println("Draw circle with radius " + radius);
}
public void draw(double b, double h) {
System.out.println("Draw triangle b=" + b + " h=" + h);
}
public void draw(int l, int b) {
System.out.println("Draw rectangle b=" + b + " l=" + l);
}
}
class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
canvas.draw();
canvas.draw(10);
canvas.draw(5.5, 3.4);
canvas.draw(7, 3);
}
}
Вывод будет примерно такой:
Draw dot
Draw circle with radius 10
Draw triangle b=5.5 h=3.4
Draw rectangle b=3 l=7
Переписывание методов в Java
При переписывании методов у нас обязательно должен быть класс предок и наследующий класс. Оба класса должны содержать метод, который в последствии будет переписан. Рассмотрим пример, приведенный ранее.
class Phone {
public void call() {
System.out.println("make abstract call");
}
}
class CellPhone extends Phone {
public void call() {
System.out.println("====Cell phone====");
}
}
class Main {
public static void main(String[] args) {
Phone cellPhone = new CellPhone();
cellPhone.call();
}
}
Вывод:
====Cell phone====
Статический полиморфизм
Этот тип полиморфизма также называют полиморфизмом компиляции. Во время компиляции этого можно достигать с помощью перегруженных методов или перегрузкой операторов.
Java не поддерживает перегрузку операторов. Хотя вы с легкостью можете перегрузить метод, реализовав множество таких методов с разными параметрами.
Пример статического полиморфизма в Java:
public void draw() {
System.out.println("Draw dot");
}
public void draw(int radius) {
System.out.println("Draw circle with radius " + radius);
}
public void draw(double b, double h) {
System.out.println("Draw triangle b=" + b + " h=" + h);
}
public void draw(int l, int b) {
System.out.println("Draw rectangle b=" + b + " l=" + l);
}
Полиморфизм времени выполнения (runtime полиморфизм)
Полиморфизм времени выполнения еще называют полиморфизмом динамического связывания. В данном случае происходит перезапись методов из класса, который наследован.
В примере ниже приведен случай приведения к типу предка (upcasting).
class Parent {}
class Child extends Parent{}
Parent parent = Child();
Также дополнительно можно вспомнить ранее обсуждаемый пример классами Phone, CellPhone. В данном случае происходила перезапись метода call.
Полиморфизм времени выполнения с наследованием
В данном примере показана цепочка наследования, где автомобиль превращается в трак и далее в брендованный тягач. Во всех случаях будет вызван свой метод вождения drive.
class Car {
public void drive() {
System.out.println("Car driving");
}
}
class Truck extends Car {
public void drive() {
System.out.println("Truck driving");
}
}
class VolvoTrack extends Truck {
public void drive() {
System.out.println("VolvoTruck driving");
}
}
class Main {
public static void main(String[] args) {
Car car = new Car();
car.drive();
Car truck = new Truck();
truck.drive();
Car volvoTrack = new VolvoTrack();
volvoTrack.drive();
}
}
Вывод:
Car driving
Truck driving
VolvoTruck driving
Полиморфизм в подтипах
Хороший пример с перегрузкой оператора +. В данном случае происходит или склеивание строки или подсчет суммы.
String s = "hello ";
String s1 = "world";
int x=10;
int y=22;
System.out.println(s+s1);
System.out.println(x+y);
Вывод:
hello world
32
Проблемы с полиморфизмом
- Довольно сложен в имплементации
- Уменьшается простота кода
- В некоторых случаях возникает дополнительная нагрузка на систему при использовании полиморфизма в проекте.
Вывод
Полиморфизм это одна из основ ООП, которая поможет сделать архитектуру вашего проекта более расширяемой. Код в таких случаях можно применять повторно, что позитивно влияет на процесс разработки и жизненный цикл приложения.