我一直试图弄清楚这个问题背后的理由,我一直在努力去理解为什么结果是这样的。我会解释我理解的一切,希望有人能为我填补空白。
想象一下你有一个班级:
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的方法签名不能保证呼叫去那里吗?
如果有人能向我解释那会很棒!
答案 0 :(得分:5)
op
是Object
类型的变量,它没有签名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)
,因为op
是Object
op.equals(p)
会调用equals(Object o)
方法,因为这是equals
唯一的Object
方法。