МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Ключове слово 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 або посилатися на об'єкт, породжений від неабстрактного спадкоємця цього класу. Читайте також:
|
||||||||
|