例如我有以下代码。
class Circle {
double radius;
public boolean equals(Object circle) {
return this.radius ==((Circle)circle).radius;
}
}
还有司机
public class Driver {
public static void main(String[] args) {
Object circle1 = new Circle();
Circle circle2 = new Circle();
System.out.println(circle1.equals(circle2));
}
}
它打印 True,但如果我将 Circle.equals() 重写为
public boolean equals(Circle circle) {
return this.radius ==((Circle)circle).radius;
}
如果 .equals() 方法采用 Circle 类型,系统将输出 False。
我知道 Circle 类是 Object 类的子类,所以编译器不会报告错误,在运行时,JVM 选择正确的覆盖方法来实现正确的行为。
如果我将代码修改为底部代码,其中 .equals() 接受 Circle Class 对象,代码可以正确实现,请告诉我原因。提前致谢。
最佳答案
带有方法签名
public boolean equals(Circle circle) {
您正在重载 equals
,而不是覆盖它;这不是编译器错误。这意味着 Circle
将继承 equals
的 Object
实现,它只是比较对象引用以查看它们是否相等。这将返回 false
。
您的equals
方法应该采用Object
来正确覆盖该方法。您还应该使用 @Override
注释,如果注释的方法没有覆盖父类(super class)中的方法,它将产生编译器错误。方法体应该在转换之前测试它的参数是否是类的实例,因此它可以返回 false
而不是抛出 ClassCastException
。
此外,如果您要覆盖 equals
,最好覆盖 hashCode
。
关于Java多态与运行时方法匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53108866/