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

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

2-03-2017, 15:45
1 539
Головна думка абстрактного класу полягає в наступному тезі: іноді потрібні не готові класи, а в «сирому» вигляді. Такі заготовки не можна прямо використовувати (створювати екземпляри).
Елементи об'єктної моделі 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 static final - всі ці модифікатори не обов'язкові. Всі методи вважаються public abstract - ці модифікатори теж можна вказати. Тепер цілком достатньо сказано про відміну абстрактного класу від інтерфейсу Java. public interface AI extends B, C, D { //тіло } Щоб оголосити клас спадкоємцем інтерфейсу, треба скористатися ключовим словом implements: class AClass implements BI, CI, DI {} Тобто, якщо в оголошенні класу після implements вказано ім'я інтерфейсу, то клас його реалізує. Спадкоємцям цього класу дістаються його елементи, тому вони також реалізують його. Змінні інтерфейсного типу теж допускаються. Вони можуть посилатися на тип класу, що реалізує цей інтерфейс, або null. Такі змінні володіють усіма елементами клас Object, адже об'єкти породжуються від класів, а ті, у свою чергу, успадковуються від класу Object. У цій статті ми розглянули деякі елементи об'єктної моделі Java – абстрактні класи, абстрактні методи, інтерфейси.
Цікаво по темі
Способи, як зробити абзац в "Ворді" 2007 року
Способи, як зробити абзац в "Ворді" 2007 року
Що таке абзац або, як його ще називають, "червоний рядок", знають абсолютно все. Адже це вивчають ще в молодших класах. Але часи змінюються: аркуші
Java: робота з файлами - запис, читання, видалення
Java: робота з файлами - запис, читання, видалення
Переважна більшість програм, написаних на Java, так чи інакше взаємодіють з файлами, зберігаючи і дістаючи звідти потрібну інформацію. Для операцій з
Java Array. Масиви в Java. Java для початківців
Java Array. Масиви в Java. Java для початківців
Для роботи з великою кількістю значень в Java, як у більшості сучасних високорівневих мов програмування, є такий потужний інструмент, як масиви.
BigInteger Java: робота з великими числами
BigInteger Java: робота з великими числами
Для роботи з числами, які не можуть зберігається в стандартних примітивних типів, в Java є спеціальний клас BigInteger. Він не тільки інкапсулює їх
Java Узагальнення: опис і методи
Java Узагальнення: опис і методи
Узагальнені типи або узагальнення в Java представляють собою потужний інструмент уніфікації коду та забезпечення безпеки типів даних. У даній статті
Java: InputStream. Потоки введення
Java: InputStream. Потоки введення
У даній статті ми розглянемо базовий клас для потоків вводу даних в Java - InputStream. Розберемо основну його функціональність і реалізації, які