gpt4 book ai didi

java - 需要帮助理解为什么在运行时不考虑重载的 equals 方法

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

我无法理解以下内容:假设我们有类 Point 重载了 equals 方法。

    public boolean equals(Object o){
System.out.println("Called with argument of Object type");
...
}

public boolean equals(Point p){
System.out.println("Called with argument of Point type");
...
}

然后在 App 类中,我们执行以下操作:

    Point p = new Point(3,4);
Object op = new Point(3,4);
op.equals(p);

这是我们在控制台中得到的:

使用对象类型的参数调用

为什么会这样?我们将 Point 类型作为参数传递,我们应该期望编译器选择最接近类型的方法。不是这样吗?我最好的猜测是,在编译时,编译器从 Object 类中获取方法的签名,并在动态绑定(bind)期间在子类中寻找完全相同的签名,因此我们的重载类的参数类型 Point 是看不到的。正确的?我不确定我在这里是否正确,但这就是我能想到的......谢谢

最佳答案

重载 解析和覆盖 解析遵循不同的规则。事实上,重载决议基于您调用方法的表达式的声明类型,所以重要的是您正在对声明为一个对象。只有当(从已声明类型的方法中)选择了具有最佳签名匹配的方法时,才会执行虚拟调用 - 此时将检查实际类型及其祖先是否覆盖了该特定方法签名 em>.

(出于同样的原因,调用例如 distanceFromOrigo() 是不可能的,即使那是 Point 中的方法,因为唯一可用的方法是在 Object 中。)

关于java - 需要帮助理解为什么在运行时不考虑重载的 equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28935023/

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