Если говорить в целом, то полиморфизм – это способность объекта иметь несколько форм. Если мы говорим об ООП, то здесь примером полиморфизма может служить перегрузка методов.
Необходимо помнить, что мы можем получить доступ к объекту только с помощью ссылочной переменной. Ссылочная переменная может иметь только один единственный тип. После того как мы объявили переменную с определённым типом, мы уже не можем его изменить.
Эта ссылка может быть перенаправлена на другой объект, только если она не была объявлена, как финальная. И тип этой переменной будет определять какие методы она может вызвать.
Виртуальные методы
Мы рассмотрим более подробно поведение перегруженных методов.
Рассмотрим пример простого приложения.
Пример:
Класс 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 работают таким образом, если мы говорим о полиморфизме.
В этом уроке мы изучили понятие полиморфизма и рассмотрели пример простого приложения.
В следующем уроке мы изучим ещё один базовый принцип ООП – инкапсуляция.