从java…对象类重写equals方法

从java…对象类重写equals方法,java,inheritance,overloading,overriding,Java,Inheritance,Overloading,Overriding,我一直在试图找出这个问题背后的基本原理,我一直在努力了解为什么结果会是这样。我会解释我所理解的一切,我希望有人能帮我填空 假设你有一门课: public class Point { public boolean equals(Object o) { if (o == null || (!(o instanceof Point)) { // Let's call this method 1 return false; }

我一直在试图找出这个问题背后的基本原理,我一直在努力了解为什么结果会是这样。我会解释我所理解的一切,我希望有人能帮我填空

假设你有一门课:

public class Point {
    public boolean equals(Object o) {
        if (o == null || (!(o instanceof Point)) { // Let's call this method 1
            return false;
        }
        Point other = (Point) o;
        return x == other.x && y == other.y;
    }

    public boolean equals(Point p) { // Let's call this method 2
        if (p == null) {
            return false;
        }
        return x == p.x && y == p.y;
    }
}
现在,我们创建以下对象:

Object o = new Object()

Point p = new Point(3,4)

Object op = new Point(3,4)
如果我们打电话:

p.equals(o) // this calls method 1

p.equals(p) // this calls method 2

p.equals(op) // this calls method 1
然而,这就是我感到困惑的地方

op.equals(o) // this calls method 1

op.equals(op) // this calls method 1

op.equals(p) // this calls method 1
为什么最后一个调用方法1?方法2的方法签名不应该保证调用可以到达那里吗


如果有人能解释给我听,那就太好了

op
对象类型的变量,它没有签名
公共布尔等于(点p)
的方法。因此,唯一可以通过调用
op.equals()
(无论参数类型如何)执行的
equals
方法具有签名
boolean equals(Object o)
。您的
类重写了
布尔等于(对象o)
,因此在后3种情况下都会调用方法1。

op
对象
类型的变量,它没有签名为
公共布尔等于(点p)
的方法。因此,唯一可以通过调用
op.equals()
(无论参数类型如何)执行的
equals
方法具有签名
boolean equals(Object o)
。您的
类重写了
布尔等于(对象o)
,因此在后3种情况下都会调用方法1。

Point p = new Point(3,4)
Object op = new Point(3,4)
由于
op
是一个
对象

op.equals(p)
将调用
equals(objecto)
方法,因为这是
Object
拥有的唯一
equals
方法

Point p = new Point(3,4)
Object op = new Point(3,4)
由于
op
是一个
对象

op.equals(p)

将调用
equals(Object o)
方法,因为这是
Object
拥有的唯一
equals
方法。

您不能覆盖
Object.equals(Object)
的签名。您不能覆盖
Object.equals(Object)
的签名。