— Привіт, Аміго!

— Привіт!

— Сьогодні ми вивчатимемо Object.
Ти вже зустрічався з ним і знаєш, що Object – базовий клас для всіх класів. У нього немає жодних даних, але є кілька методів.

— А навіщо йому методи? Хіба хтось створює його об'єкти?

— Поглянь на ситуацію з такого боку – методи, які є у Object’а, є взагалі у всіх класів. Тобто розробники Java обрали кілька методів, які, на їхню думку, мають бути у всіх класів і додали їх до класу Object.

А у поєднанні з поліморфізмом – можливістю перевизначати методи класу Object у класах-спадкоємцях – це породжує дуже потужний інструмент.

Давай поглянемо, що це за методи:

Метод Опис
public String toString()
Повертає рядкове представлення об'єкта
public native int hashCode()
public boolean equals(Object obj)
Пара методів, які використовуються для порівняння об'єктів.
public final native Class getClass()
Повертає спеціальний об'єкт, який описує поточний клас.
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout) 
public final void wait(long timeout, intnanos) 
public final void wait()
Методи контролю доступу до об'єкта з різних потоків. Управління синхронізацією потоків.
protected void finalize()
Метод дозволяє «звільнити» рідні не-Java ресурси: закрити файли, потоки і т.д.
protected native Object clone()
Метод дозволяє клонувати об'єкт: створює дублікат об'єкта.

Методи можна розбити на 6 груп. З деякими ти вже знайомий, а з рештою ми познайомимося у найближчих лекціях.

— Щось я не бачу тут чогось корисного.

— Але якби ці методи не були важливими, їх би не додали всім об'єктам! Тож раджу тобі уважніше розібратися – що це таке і навіщо вони потрібні. Якщо тобі здається, що вони не важливі, є вірогідність, що ти щось зрозумів неправильно.

— Ок. Я буду уважно слухати.

— Почнемо з методу toString();

Цей метод дозволяє отримати текстовий опис будь-якого об'єкта. Реалізація його у класі Object дуже проста:

return getClass().getName() + "@" + Integer.toHexString(hashCode());

getClass() і hashCode() – це теж методи класу Object.
Ось стандартний результат виклику такого методу

java.lang.Object@12F456

— І в чому ж користь такого опису?

— З такого опису можна дізнатися клас об'єкта, у якого викликали даний метод. А також можна розрізняти об'єкти – різним об'єктам відповідають різні цифри, що йдуть після символу @.

Але цінність цього методу в іншому. Даний метод можна перевизначити в будь-якому класі і повертати більш потрібний або детальніший опис об'єкта.

Але це ще не все. Завдяки тому, що для кожного об'єкта можна отримати його текстове зображення, в Java можна було реалізувати підтримку «складання» рядків з об'єктами.
Ось дивись:

Код Що відбувається насправді
int age = 18;
System.out.println("Age is " + age);

String s = String.valueOf(18);
String result = "Age is " + s;
System.out.println(result);
Student st = new Student("Vasya");
System.out.println("Student is " + st);

Student st = new Student("Vasya");
String result = "Student is " + st.toString();
System.out.println(result);
Car car = new Porsche();
System.out.println("My car is " + car);

Car car = new Porsche();
String result = "My car is " + car.toString();
System.out.println(result);

— Так, я завжди цим користуюся. Особливо коли пишу програму чи шукаю у ній помилки. Корисний метод