8 Полиморфизм

Полиморфизм - это возможность взаимодействия с объектом без знания его конкретного типа.

Для этого компилятору нужна гарантия, что объект поддерживает все нужные операции:

public interface Container{

    void put(double val);

    double get();

}

class Stack implements Container{...}

class Queue implements Container{...}

После чего мы можем полиморфно вызывать методы этих классов:

1)

Container c = new Stack();

c.put(1); c.put(2);

c.get(); c.get();        // 2,1

2)

Допустим, есть некоторая функция, которой для работы нужен некоторый "контейнер":

void saveData(Container c){

...

c.put(...);            // тут мы НЕ ЗНАЕМ, вызываем ли мы метод из Stack или из Queue

...

}

Далее, допустим, в main'е, программа может на этапе выполнения решить, какую разновидность контейнера использовать:

Container c;

if(...)                 // какой будет использоваться контейнер, определяется тут

    c = new Stack();

else

    c = new Queue();

saveData(c);

Полиморфный вызов - это вызов метода, при котором информация о том, какой именно метод (из нескольких) будет вызван, недоступна на этапе компиляции.

Позднее связывание - механизм, используемый компилятором для выбора одного из нескольких вызываемых методов по ходу выполнения программы, когда необходимая для этого информация недоступна на этапе компиляции.

Еще примеры:

http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

http://ermak.cs.nstu.ru/cprog/HTML/114.htm (примечание: в Java все функции - всегда виртуальные, но не все вызовы полиморфные)

Задание на +1

Разработать интерфейс ("interface") Pet (домашнее животное), с одной-единственной операцией: "Голос!" (void talk()). Реализовать интерфейс в двух классах-наследниках: Dog и Cat (каждый подает голос по своему). Собака выводит строку: "Woof!", - кошка: "Meow!". В конце каждого распечатываемого на экране сообщения - переход на новую строку.

Примеры
ВходВыход 
// array of two pointers
Pet arr[] = new Pet[2];

arr[0] = new Cat();
arr[1] = new Dog();

arr[0].talk();
arr[1].talk();
Meow!
Woof!

Скачать Pet_Tests.java
Comments