Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОПI_ЛР2011_ч3.doc
Скачиваний:
5
Добавлен:
08.11.2019
Размер:
1.42 Mб
Скачать

3.2.2Абстрактні методи й класи

Якщо клас містить хоч один абстрактний метод, то створити його екземпляри, а тим більше використати їх, не вдасться. Такий клас стає абстрактним, що обов'язково треба вказати модифікатором abstract.

Хоча елементи масиву singer [] посилаються на підкласи Dog, Cat, Cow, але все-таки це змінні типу Pet і посилатися вони можуть тільки на поля й методи, описані в суперкласі Pet. Додаткові поля підкласу для них недоступні. Тому метод, що реалізується в декількох підкласах, доводиться виносити в суперклас, а якщо там його не можна реалізувати, то оголосити абстрактним. Таким чином, абстрактні класи групуються на вершині ієрархії класів.

Можна задати порожню реалізацію методу, просто поставивши пари фігурних дужок, нічого не написавши між ними, наприклад:

void voice(){}

Вийде повноцінний метод. Але це штучне рішення, що заплутує структуру класу.

Замкнути ж ієрархію можна остаточними класами.

3.2.3Остаточні члени й класи

Позначивши метод модифікатором final, можна заборонити його перевизначення в підкласах. Це зручно з метою безпеки. Ви можете бути впевнені, що метод виконує ті дії, які ви задали. Саме так визначені математичні функції sin(), cos() та інші в класі Math. Метод Math.cos(x) обчислює саме косинус числа х. Зрозуміло, такий метод не може бути абстрактним.

Для повної безпеки, поля, які оброблюються остаточними методами, варто зробити закритими(private).

Якщо ж позначити модифікатором final весь клас, то його взагалі не можна буде розширити. Так визначений, наприклад, клас Math:

public final class Math{... }

Для змінних модифікатор final має зовсім інший зміст. Якщо позначити модифікатором final опис змінної, то її значення(а воно повинне бути обов'язково задане або тут же, або в блоці ініціалізації або в конструкторі) не можна змінити ні в підкласах, ні в самому класі. Змінна перетворюється в константу. Саме так у мові Java визначаються константи:

public final int MIN_VALUE = -1, MAX_VALUE = 9999;

Згідно зі згодою "Code Conventions" константи записуються прописними буквами, слова в них розділяються знаком підкреслення.

На самій вершині ієрархії класів Java стоїть клас Object.

3.2.4Клас Object

Якщо при описі класу ми не використовуємо ніяке розширення, тобто не пишемо слово extends і ім'я класу за ним, як при описі класу Pet, то Java уважає цей клас розширенням класу object, і компілятор дописує це за нас:

class Pet extends Object{... }

Сам же клас object не є може бути спадкоємцем, від нього починається ієрархія будь-яких класів Java. Зокрема, всі масиви - прямі спадкоємці класу object.

Оскільки такий клас може містити тільки загальні властивості всіх класів, у нього включено лише кілька самих загальних методів, наприклад, метод equals(), що порівнює даний об'єкт на рівність із об'єктом, заданим в аргументі, і повертаючий логічне значення. Його можна використати так:

Object objl = new Dog(), obj 2 = new Cat();

if(obj1.equals(obj2))...

Посилання можна порівнювати на рівність і нерівність:

obj1 == obj2; obj1 != obj 2;

У цьому випадку зіставляються адреси об'єктів, чи не вказують посилання на один і той самий об'єкт.

Метод equals() же порівнює вміст об'єктів у їхньому поточному стані, фактично він реалізований у класі object як тотожність: об'єкт дорівнює тільки самому собі. Тому його часто перевизначають у підкласах, більше того, правильно спроектовані, класи повинні перевизначити методи класу object, якщо їх не влаштовує стандартна реалізація.

Другий метод класу object, який варто перевизначати в підкласах, – метод tostring(). Це метод без параметрів, що намагається вміст об'єкта перетворити в рядок символів і повертає об'єкт класу string.

До цього методу виконуюча система Java звертається щораз, коли потрібно представити об'єкт у вигляді рядка, наприклад, у методі printing.