为什么抽象类可以强制覆盖具体方法?

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被广泛用于定位对象,使Aequals方法抽象的力量你给非默认实现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()).


npi*_*nti 10

因为在这种情况下,您希望您的对象定义自己的对象equals,据说这些对象的行为与默认实现不同.

您不应将此视为删除功能,而是强制继承对象实现自己的功能.


Kev*_*ede 6

这将允许您强制子类重新实现方法.这是否是一个好主意是另一回事.如果您想要强制执行比提供的原始方法更强的合同,您只会这样做.然后,您应该仔细记录新合同.