Переопределение метода equals () - PullRequest
1 голос
/ 29 февраля 2020
  class Deneme{
    public static void main(String[] args) {

       Object circle1 = new Circle();
       Object circle2 = new Circle();
       System.out.println(circle1.equals(circle2));

    }
 }

  class Circle{
       double radius;

    public boolean equals(Circle circle) {
    return this.radius == circle.radius;
    }
 }

И

  class Deneme{
     public static void main(String[] args) {

       Object circle1 = new Circle();
       Object circle2 = new Circle();
       System.out.println(circle1.equals(circle2));

      }
 }

  class Circle{
     double radius;
       @Override
       public boolean equals(Object circle) {
         return this.radius == ((Circle)circle).radius;
      }
  }

У меня проблемы с этими кодами. У меня два вопроса. Во-первых, в первом примере я знаю, что equals () не переопределяется. В основном методе я создал объекты circle1 и circle2, объявленные типы которых - Object. Затем мы вызываем метод equals (), но метод equals () принимает только те параметры, объявленные типы которых - Circle. Как это может быть возможно? Код выполняется без проблем.

Во-вторых, когда я пытался запустить коды, я получил «false» для первого примера и «true» для второго в консоли. Можете ли вы объяснить логи c за этими кодами? Что мы пытаемся здесь доказать? Что изменилось, когда я изменил сигнатуру метода equals () с Circle circle на Object circle?

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

в первом примере вы перегружены метода, для переопределения необходимо сохранить исходную подпись метода equals, как во втором примере .

1 голос
/ 29 февраля 2020

Если переопределение равно, попробуйте следующее. Необходимо проверять наличие нулевых значений и неправильных типов, чтобы предотвратить NPE's и casting exceptions.

  class Circle{
     double radius;

       @Override
       public int hashCode() {
           return Double.valueOf(radius).hashCode();
       }

       @Override
       public boolean equals(Object obj) {
           if (obj == this) {
               return true;
           }
           if (obj instanceof Circle) {
               Circle circle =  (Circle)obj;
               return this.radius == circle.radius;
           }
           return false;
      }
  }

Главное, что нужно помнить, это то, что тип метода equals Object, а не ваш class type.

1 голос
/ 29 февраля 2020

Первый даже не вызывает ваш метод, потому что вы передаете тип объекта в качестве ссылки, который не соответствует сигнатуре метода, и вместо этого используется объектный эквивалент.

Вы можете попробовать это, чтобы понять:

class Circle{
    double radius;

    public boolean equals(Circle circle) {
        System.out.println("This is not getting invoked");
        return this.radius == circle.radius;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...