gon*_*ard 19 java abstract-class overriding object
我使用一个库,其中一个抽象类覆盖了一个从Object抽象方法继承的具体方法:
public abstract class A {
@Override
public abstract boolean equals(Object obj);
}
Run Code Online (Sandbox Code Playgroud)
要扩展此类,我必须实现该equals方法:
public class B extends A {
@Override
public boolean equals(Object obj) {
return obj != null && obj.getClass() == B.class;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么抽象方法(A::equals)会覆盖具体方法(Object::equals)?我没有看到这个目标.
Era*_*ran 24
在这个具体的例子中,它非常有意义.如果A的子类是为了在数据库中使用,其中equals被广泛用于定位对象,使A的equals方法抽象的力量你给非默认实现equals在任何子类A(而不是使用默认的实现Object类,它只比较实例引用).
当然,你equals在B中建议的实现没有多大意义.您应该比较2 B实例的属性以确定它们是否相等.
这是一个更合适的实现:
public class B extends A {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof B))
return false;
B other = (B) obj;
return this.someProperty.equals(other.someProperty) && this.secondProperty.equals(other.secondProperty);
}
}
Run Code Online (Sandbox Code Playgroud)
另外,记得hashCode在你覆盖时覆盖equals(因为合同,equals并且hashCode如果a.equals(b) == true那时需要a.hashCode() == b.hashCode()).