Полиморфизм в Java. Типы, применение.

Полиморфизм схема

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

Полиморфизм — данный термин происходит с древнегреческого и означает «поли» — множество, «морфос» — формы. В данном случае полиморфизм означает множество форм. Полиморфизм это одна из базовых основ объектно-ориентированного программирования. Что такое ООП (объектно-ориентированное программирование) можно прочитать тут.

Полиморфизм в 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

Проблемы с полиморфизмом

  • Довольно сложен в имплементации
  • Уменьшается простота кода
  • В некоторых случаях возникает дополнительная нагрузка на систему при использовании полиморфизма в проекте.

Вывод

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

Related posts

Leave a Comment