gpt4 book ai didi

Java多态与运行时方法匹配

转载 作者:行者123 更新时间:2023-11-29 07:25:49 25 4
gpt4 key购买 nike

例如我有以下代码。

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 将继承 equalsObject 实现,它只是比较对象引用以查看它们是否相等。这将返回 false

您的equals 方法应该采用Object 来正确覆盖该方法。您还应该使用 @Override 注释,如果注释的方法没有覆盖父类(super class)中的方法,它将产生编译器错误。方法体应该在转换之前测试它的参数是否是类的实例,因此它可以返回 false 而不是抛出 ClassCastException

此外,如果您要覆盖 equals,最好覆盖 hashCode

关于Java多态与运行时方法匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53108866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com