Все объекты в Java начинаются с метода equals(Object)
, найденного в базовом классе Object
. Ваш второй пример просто переопределяет этот метод, поэтому каждый раз, когда вызывается метод equals(Object)
, вместо базовой реализации используется реализация переопределения.
Однако в первом примере вы добавили new перегрузка для метода equals()
, список параметров отличается от базового Object.equals()
метода. Эта перегрузка будет использоваться всякий раз, когда вы вызываете ее, когда оба они истинны:
- Ссылка, используемая для вызова метода, имеет тип времени компиляции
Circle
и - Параметр, передаваемый методу, имеет тип времени компиляции
Circle
Первое условие необходимо, чтобы компилятор мог найти метод в первую очередь. Если тип времени компиляции целевого экземпляра вызова не Circle
, то перегрузка метода equals(Circle)
даже не будет рассматриваться как возможная.
Второе условие требуется для того, чтобы компилятор может определить перегрузку equals(Circle)
как вызываемую. Если передаваемый параметр неизвестен во время компиляции как Circle
, то компилятор не может безопасно использовать метод equals(Circle)
и должен вместо этого выбрать перегрузку equals(Object)
.
В вашем первом Например, типы времени компиляции как целевого экземпляра для вызова метода, так и параметра, передаваемого методу, равны Object
, а не Circle
. Таким образом, у компилятора нет безопасного способа вызвать перегрузку equals(Circle)
, и он должен вместо этого вызвать equals(Object)
. И эта перегрузка, базовая реализация, просто сравнивает ссылки двух объектов, возвращая true
, только если они идентичны (которые в данном случае, будучи двумя разными экземплярами, очевидно, не являются).
См. Также Переопределение Object.equals VS Перегрузка
Напомним, что вторая реализация не совсем верна, поскольку предполагает, что передаваемый параметр circle
всегда имеет тип Circle
. Это верно для примера вырожденного кода в вашем вопросе, но не будет , как правило, истиной в реальной программе. Корректная реализация equals(Object)
сначала проверит тип параметра и немедленно вернет false
, если тип был неправильным.