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 - 为 Conways Game of Life 打印 2D 数组

c++ - 将 std::ostream 的子级传递给需要 std::ostream * 的库

javascript - 为什么在几乎没有阻塞操作的情况下,事件循环从 JavaScript 开始就存在

java - 将大文件作为流发送到 process.getOutputStream

Java NIO 从输入流读取大文件

java - 我可以像在 C# 中一样访问 Java 中的 super 属性吗?

java - 当时区更改时如何向 DateTime 添加时间?

c# - 调用没有反射的方法声明

java - 检查一个对象是否属于Java中的一个类

ios - 在运行时 objective-c 中获取数组类型