Page 80 - 6253
P. 80

4.2. Поліморфізм


                    Перекривання методів


                    Якщо  в  ієрархії  класів  ім’я,  типи  і  кількість  параметрів  методу  підкласу

            збігаються  з  іменем,  типом  і  кількістю  параметрів  методу  базового  класу,  то

            вважається, що метод підкласу перекриває (override) метод базового класу. Під час

            звертання до такого методу, завжди буде викликатися метод підкласу. Для того, щоб

            викликати  перекритий  метод  базового  класу,  використовується  наступна

            синтаксична конструкція:

                    super.ім’я_Методу

                    Перекривання  методів  відбувається  тільки  тоді,  коли  повністю  збігаються

            ім’я, типи і кількість параметрів. В іншому випадку говорять про перевантаження

            методів.


                    Динамічна диспетчеризація методів


                    Перекривання методів є основою одного з найважливіших понять мови Java –

            динамічної  диспетчеризації  методів  (dynamic  method  dispatch).  Це  механізм,  який

            дозволяє  викликати  перекриті  методи  не  під  час  компіляції  програми,  а  під  час  її

            виконання. Фактично – це реалізація поліморфізму на етапі виконання програми.

                    Якщо  перекритий  метод  викликається  за  допомогою  посилання  на  базовий

            клас, то версія методу визначається в залежності від типу об’єкта, на який вказує це

            посилання.  Іншими  словами,  визначаючим  параметром  під  час  вибору  версії

            перекритого  методу  є  тип  об’єкта,  на  який  посилається  змінна,  а  не  тип  самої

            змінної.  Отже,  якщо  в  базовому  класі  визначено  метод,  який  надалі  перекрито

            методом  у  підкласі,  то  внаслідок  посилання  змінної  базового  класу  на  об’єкти

            різного типу виконуватимуться різні версії цього методу. Розглянемо вищесказане

            на поданому нижче прикладі.

                    // Динамічна диспетчеризація методів

                    class A {

                     void call() {

                       System.out.println("Метод call() класу A");

                     }



                                                              79
   75   76   77   78   79   80   81   82   83   84   85