Елементи об 'єктної моделі Java: абстрактний клас, інтерфейс

Елементи об 'єктної моделі Java: абстрактний клас, інтерфейс

Головна думка абстрактного класу укладена в наступній тезі: іноді потрібні не готові класи, а в "сирому" вигляді. Такі заготовки не можна прямо використовувати (створювати екземпляри).

Що таке в Java абстрактний клас

Розгляньмо інший приклад. Є в Java абстрактний клас Calendar в пакеті Java.util. Він не реалізує конкретний календар, яким користуються, наприклад, у Західній і Східній Європі, Китаї, Північній Кореї, Таїланді тощо. Але в ньому є багато корисних функцій, наприклад, додавання декількох днів до конкретної дати: ці функції потрібні для будь-якої реалізації календаря. Не можна породити примірник від абстрактного класу.


Абстрактні класи, абстрактні методи Java

Припустимо, потрібно розробити кілька графічних елементів, наприклад, геометричних фігур: коло, прямокутник, зірка тощо. І існує контейнер, який їх відмальовує. У кожної компоненти зовнішній вигляд різний, тому відповідний метод (нехай він називається paint) реалізований по-різному. Однак у кожної компоненти є багато спільних рис: фігури повинні бути вписані в прямокутник, можуть мати колір, бути видимими і невидимими тощо. Тобто потрібно створити батьківський клас для всіх цих фігур, де кожна компонента буде успадковувати загальні властивості.

Але як же метод paint? Адже батьківський клас не має візуальної вистави. Якщо оголосити метод paint у кожному класі незалежно, треба буде аналізувати, яка компонента обробляється, і потім виконувати приведення типу. Тому метод треба оголосити абстрактним у батьківському класі: вказати заголовок методу без тіла. А тіло кожен похідний клас опише своє. У Java абстрактний клас може укладати абстрактні методи.

Якщо у класу є абстрактні методи, то клас є абстрактним. Перед словом class ставиться ключове слово abstract, у заголовку методу - теж. Після заголовка такого методу потрібно ставити крапку з комою. У Java абстрактний клас не може породжувати екземпляри. Якщо ми хочемо заборонити їх створення, навіть якщо у класу немає абстрактних методів, то клас можна оголосити абстрактним. Але якщо у класу є хоча б один абстрактний метод, то клас повинен бути абстрактним. Не можна, щоб клас був і abstract, і final, і метод теж. Метод не може бути abstract, private, static, native. Щоб класи-спадкоємці можна було оголошувати неабстрактними і створювати їх екземпляри, вони повинні реалізувати всі абстрактні методи батька. Сам клас може використовувати свої абстрактні методи.

Приклад:

  • abstract class AClass {
  • public abstract void method (int a);
  • }
  • class BClass extends AClass {
  • public void method (int a) {
  • //тіло
  • }

Допускаються змінні типу абстрактний клас. Вони можуть посилатися на неабстрактного нащадка цього класу або мати значення null.

Інтерфейси Java - альтернатива численному спадкуванню

У Java немає множинної спадкування, тому що тоді виникають певні проблеми. Клас не може успадкувати від декількох класів. Але зате він може реалізувати кілька інтерфейсів.


Інтерфейси і абстрактні класи Java - поняття подібні, але не збігаються. Інтерфейс можна оголосити як public, тоді він доступний всім, або можна не вказувати модифікатор public, тоді інтерфейс доступний тільки всередині свого пакета. Ключове слово abstract не потрібне, оскільки інтерфейс і так є абстрактним, але його можна вказати.

Оголошення інтерфейсу

Воно починається з заголовка і спочатку може йти ключове слово public, потім - слово interface. Потім може йти слово extends і перерахування інтерфейсів, від яких успадковується даний. Тут не допускається повторень, а також неможливо, щоб ставлення спадкування утворювало циклічну залежність. Потім йде тіло інтерфейсу, укладене у фігурні дужки. У тілі інтерфейсу оголошуються елементи: поля-константи і абстрактні методи. Всі поля є public final static - всі ці модифікатори не обов 'язкові. Всі методи вважаються public abstract - ці модифікатори теж можна вказати. Тепер цілком достатньо сказано про відмінність абстрактного класу від інтерфейсу Java.

  • public interface AI extends B, C, D {
  • //тіло
  • }

Щоб оголосити клас спадкоємцем інтерфейсу, треба скористатися ключовим словом implements:

  • class AClass implements BI, CI, DI {}

Тобто, якщо в оголошенні класу після implements вказано ім 'я інтерфейсу, то клас його реалізує. Спадкоємцям цього класу дістаються його елементи, тому вони також реалізують його.

Змінні інтерфейсного типу також допускаються. Вони можуть посилатися на тип класу, що реалізує цей інтерфейс, або null. Такі змінні володіють усіма елементами клас Object, адже об 'єкти породжуються від класів, а ті, в свою чергу, успадковуються від класу Object.

У цій статті ми розглянули деякі елементи об 'єктної моделі Java - абстрактні класи, абстрактні методи, інтерфейси.