重写equals()方法


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对象,它们声明的类型是objects。然后我们调用equals((方法,但equals(((方法只接受声明类型为Circle的参数。这怎么可能?代码正在运行,没有任何问题。

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

重写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

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

你可以试着这样理解:

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

在第一个示例中,您重载了方法,对于重写,必须保存equals方法的原始签名,如第二个示例中所示。

最新更新