Что такое класс Object и какие у него методы?

Object — это базовый (корневой) класс для всех классов в Java. Абсолютно каждый класс в Java неявно наследуется от Object, если не указано иное.

class MyClass {
// на самом деле эквивалентно: class MyClass extends Object
}

Это означает, что все объекты в Java имеют набор методов, определённых в классе Object.

📦 Назначение класса Object

  • Обеспечить базовый API для всех объектов.

  • Поддерживать функции, связанные с **сравнением, копированием, синхронизацией, отображением в строку и т. д.
    **

  • Являться универсальным типом (например, коллекции List<Object>).

Основные методы класса Object

Ниже — список методов, доступных во всех объектах Java (включая пользовательские классы), с их назначением:

1. public boolean equals(Object obj)

Сравнивает текущий объект с другим на логическое равенство.

  • По умолчанию — сравнивает ссылки (адреса).

  • Часто переопределяется для сравнения по содержимому.

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass that = (MyClass) obj;
return this.field == that.field;
}

2. public int hashCode()

Возвращает хэш-код объекта — целое число, используемое в HashMap, HashSet и т. д.

  • Должен быть согласован с equals():
    • Если a.equals(b) == true, то a.hashCode() == b.hashCode().

3. public String toString()

Возвращает строковое представление объекта.

  • По умолчанию: ИмяКласса@хэшкод.

  • Обычно переопределяется для человекочитаемого вывода:

@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}

4. protected Object clone() throws CloneNotSupportedException

Создаёт и возвращает поверхностную копию объекта.

  • Класс должен реализовывать интерфейс Cloneable, иначе будет выброшено исключение.

  • Часто не рекомендуется к использованию из-за ограничений (например, отсутствие глубокого клонирования по умолчанию).

5. public final Class<?> getClass()

Возвращает объект Class, представляющий тип объекта во время выполнения.

Object obj = new String("Hello");
Class&lt;?&gt; cls = obj.getClass(); // java.lang.String

6. protected void finalize() throws Throwable (устаревший)

Вызывается перед удалением объекта GC (аналог деструктора).

  • Считался способом освободить ресурсы, но:

    • Устарел и небезопасен.

    • Непредсказуем: GC не гарантирует вызов finalize().

  • Современная альтернатива: try-with-resources, AutoCloseable.

7. public final void wait()8. public final void wait(long timeout)9. public final void wait(long timeout, int nanos)

Блокирует текущий поток до вызова notify() / notifyAll().

  • Используется с synchronized блоками.

  • Примитивная форма межпоточной синхронизации.

10. public final void notify()11. public final void notifyAll()

Пробуждают потоки, ожидающие на этом объекте.

Методы, обычно переопределяемые

Метод Зачем переопределять?
equals() Для сравнения объектов по содержимому
--- ---
hashCode() Чтобы обеспечить корректную работу в хэш-структурах
--- ---
toString() Для удобного вывода в логи или UI
--- ---
clone() Для создания копий объекта (редко используется)
--- ---

🧠 Заключение

Класс Object — основа и универсальный родитель всех классов в Java. Его методы обеспечивают:

  • Сравнение объектов (equals, hashCode)

  • Вывод в строку (toString)

  • Синхронизацию (wait, notify)

  • Получение информации о классе (getClass)

  • Клонирование (clone, если реализован Cloneable)

Знание этих методов критически важно для грамотной работы с объектами, коллекциями, многопоточностью и логированием в Java.