gpt4 book ai didi

java - 在 Java 中覆盖 equals 时,为什么使用 Object 以外的参数不起作用?

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:57 25 4
gpt4 key购买 nike

我最近遇到了一个有趣的行为。似乎如果我覆盖 .equals() 以采用 Object 以外的参数,它不会被调用。谁能向我解释为什么会这样?这似乎违反了我对 OOP 中多态性的理解,但也许我遗漏了什么。

下面是更简单的代码,显示了我所看到的内容:

public class MyClass {
private int x;
public MyClass(int n) { x = n; }
public boolean equals(Object o) { return false; }
public boolean equals(MyClass mc) { return x == mc.x; }
public static void main(String[] args) {
List<MyClass> list = new ArrayList<MyClass>();
list.add(new MyClass(3));
System.out.println("Contains 3? " + list.contains(new MyClass(3)));
}
}

运行时,它会打印“Contains 3? false”。看起来 equals(Object) 函数被调用了,尽管还有另一个函数可以工作。相比之下,如果我这样写 equals,代码将按预期工作:

public boolean equals(Object o) {
if(!(o instanceof MyClass))
return false;
MyClass mc = (MyClass)o;
return x == mc.x;
}

为什么它不根据参数的类型确定调用哪个版本的函数?

最佳答案

你混淆了“覆盖”和“重载”。

覆盖——为多态性添加现有方法的替换定义。该方法必须具有相同的签名。签名由名称和参数类型组成。覆盖的方法是在运行时根据目标对象的运行时类型选择的。

重载——添加一个同名但签名不同的方法。重载方法是在编译时根据目标对象的编译时类型选择的。

关于java - 在 Java 中覆盖 equals 时,为什么使用 Object 以外的参数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309892/

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