Spiral, Спадкування в Java

Спадкування в Java

Спадкування (inheritance) - це процес, з якого один об'єкт може набувати властивості іншого. Точніше, об'єкт може успадковувати основні властивості іншого об'єкта і додавати до них риси, характерні лише йому. Спадкування дозволяє підтримувати концепцію ієрархії класів. Застосування рархії класів робить керованими великі потоки інформації.

Без використання ієрархії класів, для кожного об'єкта довелося б задати всі характеристики, які б повністю його визначали. Однак при використанні успадкування можна описати об'єкт шляхом визначення того загального класу (або класів), до якого він належить, з тими спеціальними рисами, що роблять об'єкт унікальним.

Модифікатори доступуМодифікатори доступу можна розглядати як з позиції інкапсуляції, так і успадкування. Якщо розглядати з позиції спадкування, то модифікатори доступу дозволяють шляхом встановлення доступу вказати члени класу, які успадковуватимуться класом спадкоємцем автоматично, а які ні. Наприклад, змінна або метод, оголошена як public у даному класі, буде автоматично перейматися в класі нащадка.

Тільки з цього класу

З цього класу та його нащадків

Для всіх класів цього пакету

Класи-адаптери та внутрішні класи як альтернатива множинному успадкування.

Більшість інтерфейсів має більше одного методу. Навіть якщо необхідно використовувати лише один метод, він все одно повинен визначити (порожніми) усі інші. Це захаращує програму та робить її погано читаною. Для скорочення коду використовуються адаптери та внутрішні класи. Класи-адаптери зручні для інтерфейсів, що мають більше одного методу, оскільки визначення всіх функційдля інтерфейсів не належить до класів.

Як відомо, Java забороняє множинне успадкування від класів, на відміну від інтерфейсів. Що ж робити, якщо користувач хоче успадкувати клас-адаптер і якийсь інший клас одночасно, наприклад Applet? Вирішення цієї проблеми полягає у застосуванні внутрішнього класу, що розширює адаптер. Нижче наведено фрагмент коду з внутрішнім класом:

public class MyClass extends Applet

addMouseListener (new MyAdapter());

// Внутрішній клас, що розширює адаптер. class MyAdapter extends MouseAdapter

public vo >mouseClicked ( MouseEvent e)

Можна ще більше скоротити код, якщо використовувати анонімне (без імені) визначення внутрішнього класу в такий спосіб.

public >MyClass extends Applet

. // Конструктор MyClass ( ) addMouseListener (новий MouseAdapter ()

public vo >mouseClicked ( MouseEvent e)

Спадкування через понижувальне та підвищуюче перетворення типів

Спадкування класів передбачає можливості перетворення типів між суперкласом та підкласом. Розрізняються два види перетворень типів - upcasting та downcasting. Підвищує перетворення (upcasting) - це перетворення від типу породженого класу (від підкласу) до базового (суперкласу). Таке перетворення допустиме завжди. На нього немає жодних обмежень і для його проведення не потрібно застосовувати додаткові синтаксичні конструкції. Це пов'язано з тим, що об'єкт підкласу завжди містить як свою частину об'єкт суперкласу.

Знижувальне перетворення (downcasting) - це перетворення від суперкласу до підкласу. Таке перетворення має низку обмежень. По-перше, воно може задаватися лише явно за допомогоюоперації перетворення типів, наприклад,

По-друге, при перетворенні має використовуватися відповідний тип. Якщо це не так, то виникає виняток ClassCastException у процесі виконання програми.

При знижувальному перетворенні часто застосовується операціяinstanceof. Ця операція перевіряє, чи має її лівий операнд клас, заданий правим операндом. Наприклад,

if (a instanceof B) b1 = (B)a;

Приклад, що поєднує в собі перетворення типів і встановлення:

Розглянемо ієрархію класів Issue - друковане видання, Book - книга, Newspaper - газета, Journal - журнал, де Book, Newspaper і Journal є спадкоємцями класу Issue.