Java多态与运行时方法匹配

标签 java polymorphism runtime

例如我有以下代码。

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/

相关文章:

Java 类型-细化映射

java - 重写 toString() 是否会导致与重写普通方法不同的行为?

java - 列表链表引用

Java ProcessBuilder.start() 比在终端中执行花费的时间要长得多

c# - linq 扩展方法 ElementAt 的性能

java - 类似的递归情况,不同的运行时间?

algorithm - 船上运动优化

ios - 动态创建的方法未被调用

java - 如何着手在 Android 中创建交互式 map

java - java中的ResultTransformer接口(interface)