Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

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

  1. Освоение операторов Java: типы, синтаксис и практические примеры
  2. Комментарии в Java: типы, использование и лучшие практики
  3. Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
  4. Освоение строк в Java: создание, методы и лучшие практики
  5. Интерфейсы в Java: концепции, реализация и лучшие практики
  6. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  7. Try-with-resources в Java: автоматическое управление ресурсами
  8. Аннотации в Java: типы, размещение и практические примеры
  9. Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
  10. Понимание Java Vector: использование, особенности и сравнение с ArrayList