从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)
的签名。