Поліморфізм є здатність
об'єкта приймати різні форми. Найбільш поширене використання поліморфізму в ООП
відбувається, коли посилання батьківського класу використовується для
позначення об'єкту класу наслідника.
Будь-який об'єкт Java,
який може пройти більше одного IS-A
тесту вважається поліморфний. Всі об'єкти Java поліморфні будь-який об'єкт
пройде IS-A тест для власного типу і
для класу Object.
Важливо знати, що єдиний
можливий спосіб отримати доступ до об'єкта це через змінну силочного типу.
Силочна змінна може бути тільки одного типу. Після оголошення, тип силочної
змінної не може бути змінений.
Силочним змінним може бути
присвоєне посилання на інший об'єкт за умови, що змінна не оголошена final. Тип силочної змінної визначає
методи, що може викликати об'єкті.
Силочна змінна може
посилатися на будь-який об'єкт оголошеного типу або будь-якого підтипу
оголошеного типу. Силочна змінна може бути оголошена класового або
интерфейсного типу.
Приклад:
Давайте подивимося на
прикладі.
Клас Deer вважається поліморфним, так як має множинне наслідування.
Нижче наведені правильні твердження для цього прикладу:
Deer IS-A Animal
Deer IS-A Vegetarian
Deer IS-A Deer
Deer IS-A Object
Коли ми використовуємо
силочну змінну на об'єкт Deer,
наступні оголошення вірні:
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
Всі силочні змінні d,a,v,o силаються на один і той же
об'єкт Deer в кучі.
Віртуальні методи:
В цьому розділі я покажу
вам, як поведінка заміщених методів в Java дозволяє використовувати поліморфізм
при проектуванні класів.
Тут уже було описано
заміщення методу, де дочірній клас може перевизначити метод його батьківського
класу. Метод заміщення по суті перекриває метод в батьківському класі, і він не
викликається, якщо дочірній клас не використовує ключове слово super при заміщені методу.
Тепер, ми розширюємо клас Employee наступним чином:
Запустивши цей код
отримаємо наступний результат:
Constructing an Employee
Constructing an Employee
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
Ми створюємо два об'єкта Salary, один з використанням посилання
типу Salary(s), а інший з використанням посилання типу Employee (e).
Коли викликаєтьсяс s.mailCheck() компілятор бачить метод mailCheck() в класі Salary під ча компіляції, і JVM викликає метод mailCheck() з класу Salary.
Виклик mailCheck() на змінній е абсолютно інша, тому що е є посилання на Employee. Коли компілятор бачить e.mailCheck (), компілятор бачить метод mailCheck() в класі Employee.
Тут, під час компіляції,
компілятор використовує mailCheck() з Employee
для перевірки цього виразу. Однак під час виконання, JVM викликає mailCheck()
з класу Salary.
Така поведінка називається віртуальним викликом методу, а
методи, називаються віртуальними методами. Всі методи в Java поводитися таким
чином, в результаті чого метод який був заміщений не викликається під час
виконання, незалежно від того, який тип даних посилання, був використаний в
вихідному коді під час компіляції.
Немає коментарів:
Дописати коментар