Руководство по Java Core. Полиморфизм.

Если говорить в целом, то полиморфизм – это способность объекта иметь несколько форм. Если мы говорим об ООП, то здесь примером полиморфизма может служить перегрузка методов.

Необходимо помнить, что мы можем получить доступ к объекту только с помощью ссылочной переменной. Ссылочная переменная может иметь только один единственный тип. После того как мы объявили переменную с определённым типом, мы уже не можем его изменить.

Эта ссылка может быть перенаправлена на другой объект, только если она не была объявлена, как финальная. И тип этой переменной будет определять какие методы она может вызвать.


Виртуальные методы

Мы рассмотрим более подробно поведение перегруженных методов.

Рассмотрим пример простого приложения.

Пример:

Класс Square


public class Square {
    private int width;

    public Square(int width) {
        this.width = width;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int calculateArea() {
        return this.width * this.width;
    }
}

Класс Rectangle


public class Rectangle extends Square {
    int height;

    public Rectangle(int width, int height) {
        super(width);
        this.height = height;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int calculateArea() {
        return this.getHeight() * this.getWidth();
    }
}

Класс AreaCalculator


public class AreaCalculator {
    public static void main(String[] args) {
        Square square = new Square(2);
        Rectangle rectangle = new Rectangle(4, 5);

        int squareArea = square.calculateArea();
        int rectangleArea = rectangle.calculateArea();

        System.out.println("Square area: " + squareArea + " sq.cm");
        System.out.println("Rectangle area: " + rectangleArea + " sq.cm");
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Square area: 4 sq.cm
Rectangle area: 20 sq.cm

Как мы видим, оба объекта имеют методы с одинаковым названием и не имеют параметров метода. Когда мы создаём оба объекта и для каждого из них мы вызываем метод calculateArea(), компилятор сам определяет какой именно метод вызвать в зависимости от типа экземпляра, который его вызывает.

Все методы в Java работают таким образом, если мы говорим о полиморфизме.

В этом уроке мы изучили понятие полиморфизма и рассмотрели пример простого приложения.

В следующем уроке мы изучим ещё один базовый принцип ООП – инкапсуляция.