Назад Зміст Вперед

7.3. Клас Object

Клас Object є базовим для всіх класів Java. Тому всі його поля і методи успадковуються і містяться у всіх класах. У класі Object містяться такі методи:
  • public Boolean equals(Object obj) – повертає true у випадку, коли рівні значення об'єкта, з якого викликається метод, і об'єкта, який передається через посилання obj в списку параметрів. Якщо об'єкти не рівні, повертається false. У класі Object рівність розглядається як рівність посилань і еквівалентна оператору порівняння "==". Але в нащадках цей метод може бути перевизначений, і може порівнювати об'єкти за їх вмістом. Наприклад, так відбувається для об'єктів оболонкових числових класів. Це легко перевірити за допомогою такого коду:
Double d1=1.0,d2=1.0;
System.out.println("d1==d2 ="+(d1==d2));
System.out.println("d1.equals(d2) ="+(d1.equals(d2)));
Перша стрічка виведе d1==d2 =false, а другаd1.equals(d2) =true 

public int hashCode() – видає хеш-код об'єкта. Хеш-кодом називається умовно унікальний числовий ідентифікатор, що зіставляється якому-небуть елементу. З міркувань безпеки видавати адресу об'єкта прикладній програмі можна. Тому в Java хеш-код замінює адресу об'єкта в тих випадках, коли для будь-яких цілей треба зберігати таблиці адрес об'єктів.
protected Object clone() throws CloneNotSupportedException – метод займається копіюванням об'єкта і повертає посилання на створений клон (дублікат) об'єкта. У спадкоємців класу Object його обов'язково треба перевизначити, а також вказати, що клас реалізує інтерфейс Clonable. Спроба виклику методу з об'єкта, що не підтримує клонування, викликає збудження виняткової ситуації CloneNotSupportedException ("Клонування Не підтримується"). Про інтерфейси і виняткові ситуації буде розказано в подальшому.

Розрізняють два види клонування: дрібне (shallow), коли в клон одне одного копіюються значення полів оригінального об'єкта, і глибоке (deep), при якому для полів посилального типу створюються нові об'єкти, клонуючі об'єкти, на які посилаються поля оригіналу. При дрібному клонуванні і оригінал, і клон будуть посилатися на одні й ті самі об'єкти. Якщо об'єкт має поля тільки примітивних типів, відмінності між дрібним і глибоким клонуванням немає. Реалізацією клонування займається програміст, який розробляє клас, автоматичного механізму клонування немає. І саме на етапі розробки класу слід вирішити, який варіант клонування вибирати. У переважній більшості випадків потрібне глибоке клонування.
public final Class getClass() – повертає посилання на мета об'єкт типу клас. З його допомогою можна отримувати інформацію про клас, до якого належить об'єкт, і викликати його методи класу і поля класу.

protected void finalize() throws Throwable –викликається перед знищенням об'єкта. Повинен бути перевизначений в тих нащадках Object, в яких потрібно вчиняти будь-які допоміжні дії перед знищенням об'єкта (закрити файл, вивести повідомлення, отрисовать що-небудь на екрані, і т.п.). Детальніше про цей метод йдеться у відповідному параграфі.
public String toString() – повертає строкове представлення об'єкта (настільки адекватно, наскільки це можливо). У класі Object цей метод реалізує видачу в рядок повного імені об'єкта (з ім'ям пакета), після якого слідує символ '@', а потім в шістнадцятковому вигляді хеш-код об'єкта. У більшості стандартних класів цей метод перевизначений. Для числових класів повертається рядкове представлення числа, для рядкових - вміст рядка, для символьного - сам символ (а не рядкове представлення його коду!). Наприклад, наступний фрагмент коду
Object obj=new Object();
System.out.println(" obj.toString() дает "+obj.toString());
Double d=new Double(1.0);
Character c='A';
System.out.println(" d.toString()дает "+d.toString());
System.out.println("c.toString() дает "+c.toString());
виведе
obj.toString() дает java.lang.Object@fa9cf
d.toString()дает 1.0
c.toString()дает A
Також є методи notify()notifyAll(), і кілька перевантажених варіантів методу waitпризначені для роботи з потоками (threads). Про них йдеться в розділі, присвяченому потокам.
.