Что знаешь о классе object
Класс Object в Java является корневым классом в иерархии классов: каждый класс неявно наследуется от него, если только не указан другой родительский класс. Это означает, что Object — суперкласс для всех остальных классов, и он предоставляет базовые методы, доступные любому объекту.
Основные методы класса Object
Класс Object определяет набор методов, которые наследуются всеми классами. Наиболее важные из них:
-
equals(Object obj)— определяет, равен ли один объект другому. Стандартная реализация сравнивает ссылки (т.е. проверяет, указывают ли обе ссылки на один и тот же объект). В пользовательских классах этот метод часто переопределяют для сравнения по значению полей. -
hashCode()— возвращает целочисленный хеш-код объекта, используемый в хеш-таблицах, таких какHashMapиHashSet. При переопределенииequalsнеобходимо переопределить иhashCode, чтобы соблюдать контракт: равные объекты должны иметь одинаковые хеш-коды. -
toString()— возвращает строковое представление объекта. Реализация по умолчанию возвращает строку видаClassName@hashCode(в шестнадцатеричном формате). Обычно переопределяется для вывода более информативного описания объекта.
-
clone()— создает и возвращает копию объекта. Для вызова этого метода класс должен реализовать интерфейсCloneable, иначе будет выброшеноCloneNotSupportedException. Метод имеет модификаторprotected, поэтому для вызова извне его нужно переопределить и сделать публичным. -
finalize()— вызывается сборщиком мусора перед уничтожением объекта. Может использоваться для освобождения ресурсов, но его использование не рекомендуется из-за непредсказуемости момента вызова и влияния на производительность. -
getClass()— возвращает объектClass<?>, представляющий класс данного объекта. Позволяет получать метаданные о классе во время выполнения (рефлексия). -
Методы синхронизации:
notify(),notifyAll(),wait(long timeout)и их перегрузки — используются для организации взаимодействия потоков через монитор объекта.
Контракт equals и hashCode
Особое внимание на собеседованиях уделяют контракту между equals и hashCode. Если два объекта равны по equals, их hashCode должны быть одинаковыми. Обратное не обязательно: разные объекты могут иметь одинаковый хеш-код (коллизия). Нарушение этого контракта приводит к некорректной работе коллекций, основанных на хешировании, например, HashMap может не найти ключ.
Пример правильного переопределения:
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}Роль Object в системе типов
Благодаря тому, что все классы наследуются от Object, любой объект можно присвоить переменной типа Object. Это позволяет создавать универсальные структуры данных и методы, работающие с любыми типами. Например, до появления дженериков коллекции хранили элементы как Object, что требовало явного приведения типов при извлечении.
Методы equals, hashCode, toString и другие обеспечивают единообразное поведение объектов, что упрощает отладку, логирование и сравнение. Знание этих методов необходимо для корректной реализации пользовательских классов.
Коротко
Object— корневой класс Java, от которого неявно наследуются все классы.- Ключевые методы:
equals,hashCode,toString,clone,finalize,getClass, а также методы синхронизацииwait,notify,notifyAll. - При переопределении
equalsвсегда переопределяйтеhashCode, чтобы соблюдать контракт. toStringполезно переопределять для читаемого представления объекта.cloneтребует реализацииCloneable, иначе выбрасывается исключение.finalizeустарел и не рекомендуется к использованию.
