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

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

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

java абстрактний клас

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

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

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

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

абстрактні класи абстрактні методи java
Але як же метод 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 немає множинного спадкоємства, бо тоді виникають певні проблеми. Клас не може успадковуватися від декількох класів. Але зате він може реалізувати кілька інтерфейсів.

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

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

відміну абстрактного класу від інтерфейсу java

Воно починається з заголовка і спочатку може йтиключове слово 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 - абстрактні класи, абстрактні методи, інтерфейси.

Ще почитайте: