Полиморфизм в Java: концепции и практическое применение
Полиморфизм — способность объекта принимать множество форм. В ООП чаще всего проявляется, когда ссылка родительского класса ссылается на объект дочернего класса.
Любой Java-объект, проходящий более одного теста IS-A, является полиморфным. Все объекты полиморфны, так как проходят IS-A для своего типа и для Object.
Ссылочные переменные и полиморфизм
- Ссылочная переменная имеет один тип, который не меняется после объявления.
- Может ссылаться на объект своего типа или любого подтипа.
- Тип ссылки определяет, какие методы можно вызвать.
Пример
interface Vegetarian {}
class Animal {}
class Deer extends Animal implements Vegetarian {}
Deer полиморфен: IS-A Animal, IS-A Vegetarian, IS-A Deer, IS-A Object.
Допустимые присваивания:
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
Все ссылки указывают на один объект в куче.
Виртуальные методы
Переопределённые методы в Java являются виртуальными по умолчанию. Вызов происходит на основе реального типа объекта во время выполнения (dynamic method dispatch).
Пример: Employee и Salary
class Employee {
private String name, address; private int number;
public Employee(String name, String address, int number) { ... }
public void mailCheck() { System.out.println("Mailing check to " + name); }
}
class Salary extends Employee {
private double salary;
public Salary(String name, String address, int number, double salary) { ... }
@Override
public void mailCheck() {
System.out.println("Within mailCheck of Salary class");
System.out.println("Mailing check to " + getName() + " with salary " + salary);
}
}
public class VirtualDemo {
public static void main(String[] args) {
Salary s = new Salary("Mohd Mohtashim", "Ambehta", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston", 2, 2400.00);
s.mailCheck(); // вызов Salary.mailCheck()
e.mailCheck(); // тоже вызывает Salary.mailCheck()!
}
}
Результат:
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0
При вызове e.mailCheck() компилятор видит метод в Employee, но JVM во время выполнения вызывает переопределённый метод в Salary. Это и есть виртуальный вызов метода.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList