Что такое класс 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<?> 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.