Какие методы есть во всех классах Java
Что проверяют
Знаете ли вы состав класса-предка и понимаете ли, почему методы ожидания находятся именно там.
Как отвечать
Все классы неявно наследуют Object, поэтому у любого объекта есть его методы:
equals(Object): сравнение по содержимому. Реализация по умолчанию сравнивает ссылки;hashCode(): числовой код для хеш-структур;toString(): строковое представление, по умолчанию имя класса и хеш;getClass(): объект типа во время выполнения, финальный;clone(): защищённый, поверхностное копирование, требует маркерного интерфейса;finalize(): устарел и удалён из современных версий;wait()в трёх вариантах,notify()иnotifyAll(): примитивы ожидания и оповещения, все финальные.
Самый содержательный вопрос вдогонку обычно такой: почему методы ожидания живут в Object. Потому что монитором в Java может служить любой объект: конструкция синхронизации принимает произвольную ссылку. Раз любой объект может быть монитором, у любого объекта должны быть операции ожидания на этом мониторе. Отсюда и требование вызывать их только внутри синхронизированного блока по тому же объекту, иначе получите исключение о неверном состоянии монитора.
Про пару сравнения и хеша: они связаны контрактом, равные объекты обязаны иметь равный хеш. Нарушение приводит к тому, что объект теряется в хеш-структурах. Поэтому их переопределяют только вместе, а в современном коде чаще берут запись, где обе реализации генерируются автоматически.
Про клонирование: механизм считается неудачным. Маркерный интерфейс без методов, поверхностное копирование по умолчанию, защищённый доступ. Практика это конструктор копирования или фабричный метод.
В Kotlin у корневого типа только три метода: сравнение, хеш и строковое представление. Остальное перенесено в функции расширения и в отдельные средства.
Где спотыкаются
Переопределяют сравнение и забывают хеш.
Вызывают ожидание вне синхронизированного блока.
Реализуют клонирование вместо конструктора копирования.
Не могут объяснить, зачем методы ожидания находятся в общем предке.