从java ... Object类重写equals方法

时间:2016-10-08 15:21:02

标签: java inheritance overloading override

我一直试图弄清楚这个问题背后的理由,我一直在努力去理解为什么结果是这样的。我会解释我理解的一切,希望有人能为我填补空白。

想象一下你有一个班级:

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的方法签名不能保证呼叫去那里吗?

如果有人能向我解释那会很棒!

2 个答案:

答案 0 :(得分:5)

opObject类型的变量,它没有签名public boolean equals(Point p)的方法。因此,可以通过调用equals执行的唯一op.equals()方法(无论参数类型如何)都具有签名boolean equals (Object o)。您的Point课程会覆盖boolean equals (Object o),因此在后3个案例中都会调用您的方法1。

答案 1 :(得分:1)

鉴于此

Point p = new Point(3,4)
Object op = new Point(3,4)

,因为opObject

op.equals(p)

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