Ответ
Класс Object — это корневой суперкласс для всех классов в Java. Он предоставляет базовые методы, которые определяют общее поведение для всех объектов.
Ключевые методы и их назначение:
equals(Object obj)— сравнивает объекты на равенство. Реализация по умолчанию (==) проверяет равенство ссылок.hashCode()— возвращает целочисленный хеш-код объекта. Критически важен для корректной работы коллекций, основанных на хеше (например,HashMap,HashSet). Контракт междуequals()иhashCode()требует, чтобы равные объекты имели одинаковый хеш-код.toString()— возвращает строковое представление объекта. По умолчанию выводит имя класса и хеш-код.getClass()— возвращает объектClass, представляющий тип объекта во время выполнения.clone()— создает и возвращает копию объекта. Требует реализации интерфейсаCloneable.finalize()— устаревший метод, вызываемый сборщиком мусора перед удалением объекта (не рекомендуется к использованию).wait(),notify(),notifyAll()— методы для синхронизации потоков.
Пример переопределения equals() и hashCode():
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Переопределяя эти методы, вы можете задать семантику равенства и эффективную работу в хеш-коллекциях для своих классов.
Ответ 18+ 🔞
А, ну вот, подъехали к самому корню всей этой java-движухи! Класс Object, блядь, это как тот дед, от которого все остальные классы понаделали детей, внуков и правнуков до овердохуища. Он сидит на вершине иерархии и всех кормит базовыми повадками.
Смотри, какие у него главные приколы-методы:
equals(Object obj)— этот чувак отвечает на вопрос «они одинаковые?». А по дефолту он, сука, просто ссылки сравнивает (==), то есть «это один и тот же кусок памяти или нет?». Для своих нужд почти всегда его надо переписывать, иначе хер что работать будет.hashCode()— а это его брат-близнец, который выдает числовой код объекта. Запомни раз и нахуй: если ты переопределилequals, то обязан переписать иhashCode, чтобы равные объекты давали одинаковый код! ИначеHashMapилиHashSetтебя просто сожрут и не подавятся, коллекции начнут глючить так, что мало не покажется.toString()— ну тут всё ясно, он должен красиво рассказывать, что за объект такой. По умолчанию он выдаёт какую-то хуйню вродеPerson@1b6d3586, что, конечно, ни о чём не говорит. Переписывай, чтобы люди понимали.getClass()— этот тебе скажет, какого конкретно типа объект в рантайме. Полезно, когда нужно понять, не подсунули ли тебе вместоPersonкакого-нибудьAnimal.clone()— метод для клонирования, но он такой капризный, ёпта! Чтобы работал, нужно ещё и интерфейсCloneableреализовать, а иначе кинет исключение. В общем, головняк, многие его не любят.finalize()— про этот метод забудь, как страшный сон. Устарел, не предсказуем, вызывается сборщиком мусора когда захочет. Не используй его, серьёзно, в рот меня чих-пых!wait(),notify(),notifyAll()— это уже для взрослых, для синхронизации потоков. Тоже тема отдельная и не для слабонервных.
Вот смотри, как обычно переписывают equals и hashCode, чтобы не быть мудаками:
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true; // если это один и тот же объект — сразу true
if (o == null || getClass() != o.getClass()) return false; // если null или класс другой — false
Person person = (Person) o; // кастуем, блядь, осторожно
return age == person.age && Objects.equals(name, person.name); // сравниваем поля
}
@Override
public int hashCode() {
return Objects.hash(name, age); // удобный хелпер, сам посчитает хеш по полям
}
}
Вот так вот, переопределяешь эти два метода — и твой класс сразу становится адекватным гражданином java-мира, его можно нормально сравнивать и пихать в хеш-коллекции без сюрпризов. А не переопределишь — сам потом будешь чесать репу, почему ничего не работает.