好的,所以我们假设您有两个课程:ClassA
和ClassB
ClassA
延伸Object
和ClassB
延伸ClassA
ClassA
没有参数构造函数ClassB
有一个整数变量x和一个带有整数参数的构造函数,用于初始化x ClassA
不会覆盖equals
继承自Object
ClassB
equals
会覆盖ClassB
,因此如果整数x在两个对象中具有相同的值,则 //In Class B you have this method:
public boolean equals (Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != this.getClass()) {
return false;
}
if (!super.equals(obj)) {
return false;
}
B b = (B) obj;
return this.x == b.x;
}
的两个对象被视为相等。
B b1 = new B(1);
B b2 = new B(1);
System.out.println(b1.equals(b2));
主要是你要运行这段代码
B
我相信会打印出“假”,但我正在努力理解为什么。也许我并没有完全理解覆盖的概念,但我只是认为,因为Object.equals
应该覆盖{{1}}方法,所以它可以确保x字段是相同的。
我错过了哪些“错误”?
答案 0 :(得分:6)
你应该省略
if (!super.equals(obj))
{
return false;
}
因为那将使用默认的equals()方法(检查对象标识)
答案 1 :(得分:2)
你的代码永远不会超过super.equals检查,因为(因为Object.equals
正在比较对象引用),任何两个不同的对象总是会测试false是否相等。 Object.equals
正在比较引用,它返回true的唯一时间是它是否将引用与自身进行比较。
通常,如果你重写equals,那是因为你想按值比较对象(比如String或BigInteger),所以在这种情况下没有理由引用超类的equals方法(通过引用进行比较)。 p>