МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Ключове слово abstractПлан Клас Collections Клас Collections є класом-утилітою й містить кілька допоміжних методів для роботи із класами, що забезпечують різні інтерфейси колекцій. Наприклад, для сортування елементів списків, для пошуку елементів в упорядкованих колекціях і т.д. Але, мабуть, найбільш важливою властивістю цього класу є можливість одержання синхронізованих варіантів класів-колекцій.
Тема 8 Об'єктна модель Java 1 Статичні елементи 2 Ключові слова thisі super 3 Ключове слово abstract 4 Інтерфейси
1 Статичні елементи До цього моменту під полями об'єкту ми завжди розуміли значення, які мають сенс тільки в контексті деякого екземпляра класу. Наприклад:
class Human { private String name; }
Перш ніж звернутися до поля name, необхідно отримати посилання на екземпляр класу Human. Але бувають дані іншого характеру. Припустимо, необхідно зберігати кількість всіх людей (примірників класу Human, існуючих у системі). Зрозуміло, що загальна кількість людей не є характеристикою якоїсь однієї людини, вона відноситься до всього типу в цілому. Звідси з'являється назва «поле класу», на відміну від «поля об'єкта». Оголошуються такі поля за допомогою модифікатора static:
class Human { public static int totalCount; }
Щоб звернутися до такого поля, посилання на об'єкт не потрібно, цілком достатньо імені класу. Але для зручності дозволено звертатися до статичних полів і через посилання:
Human h = new Human (); h.totalCount = 100;
Однак таке звернення конвертується компілятором. Статичні поля також можуть бути оголошені як final, це означає, що вони повинні бути проініціалізовані суворо один раз і потім вже більше не змінювати свого значення. Аналогічно, статичні методи можуть бути оголошені як final, а це означає, що їх не можна перекривати в класах-спадкоємцях. Для ініціалізації статичних полів можна користуватися статичними методами й не можна звертатися до динамічних. Вводять спеціальні поняття - статичний і динамічний контексти. До статичному контексту відносять статичні методи, статичні ініціалізатори, ініціалізатори статичних полів. Всі інші частини коду мають динамічний контекст. При виконанні коду в динамічному контексті завжди є об'єкт, з яким йде робота в даний момент. Наприклад, для динамічного методу це об'єкт, у якого він був викликаний, і так далі. Навпаки, зі статичним контекстом асоційованих об'єктів немає. Наприклад, як вже вказувалося, стартовий метод main() викликається в тої момент, коли жоден об'єкт ще не створений. При зверненні до статичного методу, наприклад, MyClass.staticMethod(), також може не бути жодного примірника MyClass. Звертатися до статичних методів класу Math можна, а створювати його екземпляри ні. А раз немає асоційованих об'єктів, то й користуватися динамічними конструкціями не можна. Можна тільки посилатися на статичні поля й викликати статичні методи. Або звертатися до об'єктів через посилання на них, отримані в результаті виклику конструктора або як аргумент методу і т.п.
2 Ключові слова this і super Якщо виконання коду відбувається в динамічному контексті, тобто має бути об'єкт, асоційований з ним. У цьому випадку ключове слово this повертає посилання на даний об'єкт:
class Test { public Object getThis () { return this; // Перевіримо, куди вказує це посилання } public static void main (String s []) { Test t = new Test (); System.out.println (t.getThis () == t); // Порівняння } }
Тобто всередині методів слово this повертає посилання на об'єкт, у якого цей метод викликаний. Воно необхідне, якщо потрібно передати аргумент, рівний посиланням на даний об'єкт, у який-небудь метод. Також слово this застосовується в конструкторах для явного виклику в першому рядку іншого конструктора цього ж класу. Там також може застосовуватися й слово super, алі вже для звернення до конструктора батьківського класу. Інші застосування слова super також пов'язані зі зверненням до батьківського типу об'єкта. Наприклад, воно може знадобитися в разі перевизначення (overriding) батьківського методу. Перевизначенням називають оголошення методу, сигнатура якого збігається з одним із методів батьківського класу.
class Parent { public int getValue () { return 5; } } class Child extends Parent { // Перевизначення методу public int getValue () { return 3; } public static void main (String s []) { Child c = new Child (); // Приклад виклику перевизначеного методу System.out.println (c.getValue ()); } }
Оскільки ключові слова this і super вимагають наявності асоційованого об'єкту, тобто динамічного контексту, використання їх у статичному контексті заборонено. Іноді має сенс описати тільки заголовок методу, без його тіла, і таким чином оголосити, що даний метод буде існувати в цьому класі. Реалізацію цього методу, тобто його тіло, можна описати пізніше. Розглянемо приклад. Припустимо, необхідно створити набір графічних елементів, неважливо, яких саме. Наприклад, вони можуть представляти собою геометричні фігури – коло, квадрат, зірка і т.д.; або елементи, призначені для користувальницького інтерфейсу – кнопки, поля введення і т.д. Зараз це не має вирішального значення. Крім того, існує спеціальний контейнер, який займається їх промальовкою. Зрозуміло, що зовнішній вигляд кожної компоненти унікальний, а значить, відповідний метод (назвемо його paint()) буде реалізований в різних елементах по-різному. Алі в тойже часу компонентів може бути багато спільного. Наприклад, будь-який з них займає деяку прямокутну область контейнера. Складні контури фігури необхідно вписати в прямокутник, щоб можна було аналізувати перекриття, перевіряти, чи не вилазить компонент за межі контейнера, і т.д. Кожна фігура може мати колір, яким її треба малювати, може бути видимою, або невидимою й т.д. Очевидно, що корисно створити батьківський клас для всіх компонентів і один раз оголосити в ньому всі загальні властивості, щоб кожен компонент лише наслідував їх. Алі як вчинити з методом відтворення? Адже батьківський клас не представляє собою будь-яку фігуру, у нього немає візуального представлення. Можна оголосити метод paint() у кожному компоненті незалежно. Алі тоді контейнер повинен буде володіти складною функціональністю, щоб аналізувати, який саме компонент зараз обробляється, виконувати приведення типу і лише після цього викликати потрібний метод. Саметут зручно оголосити абстрактний метод у батьківському класі. У нього немає зовнішнього вигляду, але відомо, що він є в його спадкоємця. Тому заголовок методу описується в батьківському класі, тіло методу у спадкоємця своє, а контейнер може спокійно користуватися тільки базовим типом, не роблячи ніяких приведень. Зверніть увагу - оскільки абстрактний метод не має тіла, після опису його заголовка ставитися крапка з комою. А раз у нього немає тіла, то до нього не можна звертатися, поки його спадкоємці не опишуть реалізацію. Це означає, що не можна створювати екземпляри класу, у якого є абстрактні методи. Такий клас сам оголошується абстрактним. Клас може бути абстрактним і в тому випадку, якщо в нього немає абстрактних методів, алеповинен бути абстрактним, якщо такі методи є. Розробник може вказати ключове слово abstract у списку модифікаторів класу, якщо хоче заборонити створення екземплярів цього класу. Класи-спадкоємці повинні реалізувати (implements) всі абстрактні методи (якщо вони є) свого абстрактного класу, щоб їх можна було оголошувати неабстрактнимі й породжувати від них екземпляри. Звичайно, клас не може бути одночасно abstract і final. Це ж вірно й для методів. Крім того, абстрактний метод не може бути private, native, static. Сам клас може без обмежень користуватися своїми абстрактними методами. З цієї ж метою можна оголошувати змінні типу абстрактний клас. Вони можуть мати значення null або посилатися на об'єкт, породжений від неабстрактного спадкоємця цього класу. Читайте також:
|
||||||||
|