Урок 23. Полиморфизм – Devcolibri

Урок 23. Полиморфизм

После просмотра видеоверсии урока обязательно изучите текстовый материал. Он дополняет видеоматериал и позволит вам полностью понять тему урока.

Использование полиморфизма на практике

В видео версии урока не хватает наглядного примера использования полиморфизма. Помним, что у нас есть два класса (для упрощения понимания все остальные методы удалены):

public class People {

    public void sayHello() {
        System.out.println("Hello from People class!");
    }
}
public class Sportsman extends People {

    @Override
    public void sayHello() {
        System.out.println("Hello from Sportsman class!");
    }
}

Видим, что класс Sportsman наследуется от класса People и переопределяет метод sayHello. Теперь создадим новый экземпляр класса Sportsman, только в левой части мы будем использовать тип People для большей гибкости, которую мы продемонстрируем чуть позже.

public class Main {

    public static void main(String[] args) {
        People people = new Sportsman();
        people.sayHello();
    }
}

В результате в консоль выведется строка: Hello Devcolibri.com! В данном случае в левой части мы объявляем объект типа People, но в правой части мы указываем конкретный тип Sportsman. Мы можем это сделать, т.к. класс Sportsman наследуется от класса People. Для более наглядного примера давайте создадим ещё один класс:

public class Military extends People {
    @Override
    public void sayHello() {
        System.out.println("Hello from Military class!");
    }
}

И теперь давайте создадим методы, которые будут выводить приветствие классов Military, Sportsman:

public class Main {

    public static void main(String[] args) {
        People sportsman = new Sportsman();
        displaySportsmanInfo(sportsman);

        People military = new Military();
        displayMilitaryInfo(military);
    }

    public static void displaySportsmanInfo(Sportsman sportsman) {
        sportsman.sayHello();
    }

    public static void displayMilitaryInfo(Military military) {
        military.sayHello();
    }
}

В консоль выведется:

Hello from Sportsman class!
Hello from Military class!

А теперь давайте объединим эти два метода:

public class Main {

    public static void main(String[] args) {
        People sportsman = new Sportsman();
        displayPeopleInfo(sportsman);

        People military = new Military();
        displayPeopleInfo(military);
    }

    public static void displayPeopleInfo(People people) {
        people.sayHello();
    }
}

Когда вы запустите приложение, вы увидите, что вывод в консоль не изменился. Это и есть простейший пример полиморфизма. Несмотря на то, что слева мы пишем тип People виртуальная машина Java вызывает метод у типа, который мы объявляем справа. Такой вызов часто называют вызов виртуального метода(virtual method invocation), весь процесс называют позднее связывание. Мы можем работать со всеми наследниками класса People так же, как и с классом People. Но при этом у нас есть доступ только к методам и полям из класса People. При этом, методы вызывается у конкретных реализаций Military и Sportsman. Теперь представьте, что у нас появилось ещё 5 наследников класса People. Мы сможем использовать для них тот же самый метод displayPeopleInfo, что позволит нам избежать написания 5 новых методов.

Возникли проблемы при прохождении? Напишите нам в чат поддержки Вконтакте или Facebook. Мы поможем вам решить проблему и вы сможете продолжить обучение.
УВИДЕТЬ ВСЕ Добавить заметку
ВЫ
Добавить ваш комментарий