Метод равных объекта? - PullRequest
       7

Метод равных объекта?

0 голосов
/ 25 марта 2020

Кто-нибудь может объяснить, почему первый код равен false, а второй - true? enter image description here

enter image description here

1 Ответ

0 голосов
/ 25 марта 2020

Все объекты в Java начинаются с метода equals(Object), найденного в базовом классе Object. Ваш второй пример просто переопределяет этот метод, поэтому каждый раз, когда вызывается метод equals(Object), вместо базовой реализации используется реализация переопределения.

Однако в первом примере вы добавили new перегрузка для метода equals(), список параметров отличается от базового Object.equals() метода. Эта перегрузка будет использоваться всякий раз, когда вы вызываете ее, когда оба они истинны:

  1. Ссылка, используемая для вызова метода, имеет тип времени компиляции Circle и
  2. Параметр, передаваемый методу, имеет тип времени компиляции 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, если тип был неправильным.

...