覆盖 equals() 方法

Overriding the equals() method

  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() 没有被覆盖。在 main 方法中,我创建了 circle1 和 circle2 对象,它们的声明类型是对象。然后我们调用 equals() 方法,但 equals() 方法只接受声明类型为 Circle 的参数。怎么可能?代码 运行ning 没有任何问题。

其次,当我尝试 运行 代码时,我在第一个示例中得到了 "false",在控制台中得到了第二个示例中的 "true"。你能解释一下这些代码背后的逻辑吗?我们想在这里证明什么?当我将 equals() 方法的签名从 Circle circle 更改为 Object circle 时发生了什么变化?

第一个甚至没有调用您的方法,因为您传递的对象类型作为引用与您的方法签名不匹配,而是使用对象的 equals。

你可以试试这个来理解:

class Circle{
    double radius;

    public boolean equals(Circle circle) {
        System.out.println("This is not getting invoked");
        return this.radius == circle.radius;
    }
}

在第一个例子中,你overloaded方法, 对于覆盖,您必须保存 equals 方法的原始签名,如第二个示例。

重写 equals 时尝试以下操作。有必要检查空值和不正确的类型以防止 NPE'scasting 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.