Какие знаешь стандартные методы класса Object?

«Какие знаешь стандартные методы класса Object?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. equals(Object obj) — определяет логическое равенство объектов (по умолчанию сравнивает ссылки ==). Всегда переопределяется вместе с hashCode().
  2. hashCode() — возвращает целочисленный хэш-код объекта. Используется в хэш-коллекциях (HashMap, HashSet). Контракт: если два объекта равны по equals(), их хэш-коды должны быть равны.
  3. toString() — возвращает строковое представление объекта. По умолчанию выводит имя класса и хэш-код. Часто переопределяется для удобства отладки и логирования.
  4. getClass() — возвращает объект класса Class данного объекта во время выполнения (runtime). Используется в рефлексии.
  5. wait(), notify(), notifyAll() — методы для синхронизации потоков (низкоуровневый механизм). Используются внутри synchronized блоков.
  6. clone() — создает и возвращает копию объекта. Класс должен реализовывать интерфейс Cloneable. Использование требует осторожности (поверхностное/глубокое копирование).
  7. finalize() — устаревший метод, вызываемый сборщиком мусора перед удалением объекта. Не рекомендуется к использованию.

Пример переопределения equals() и hashCode() (важно для тестирования и коллекций):

public class User {
    private final Long id;
    private final String email;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id); // Сравниваем только по ID
    }

    @Override
    public int hashCode() {
        return Objects.hash(id); // Хэш тоже вычисляем только по ID
    }
}

Для QA/автотестов: Понимание этих методов критично, когда вы пишете кастомные ассерты или работаете с коллекциями объектов в тестах. Неправильная реализация equals/hashCode может привести к некорректному поведению HashSet или HashMap в тестовых данных.