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

时间:2015-06-17 07:36:00

标签: java object override abstract-class

我使用一个库,其中抽象类使用抽象方法覆盖从Object继承的具体方法:

public abstract class A {
    @Override
    public abstract boolean equals(Object obj);
}

要扩展此类,我必须实现equals方法:

public class B extends A {
    @Override
    public boolean equals(Object obj) {
        return obj != null && obj.getClass() == B.class;
    }
}

为什么抽象方法(A::equals)会覆盖具体方法(Object::equals)?我没有看到这个目标。

5 个答案:

答案 0 :(得分:24)

在这个具体的例子中,它非常有意义。如果要在集合中使用A的子类,其中equals被广泛用于定位对象,那么使A的{​​{1}}方法抽象强制您提供非默认实现equals的任何子类中equals的{​​{1}}(而不是使用仅比较实例引用的Object类的默认实现)。

当然,您在B中建议的A实现没有多大意义。您应该比较2 B实例的属性以确定它们是否相等。

这是一个更合适的实现:

equals

此外,请务必在覆盖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); } } 时覆盖hashCode(因为equalsequals的合同要求hashCode然后{{1} }})。

答案 1 :(得分:10)

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:3)

这意味着您必须实施您自己的equals()方法

答案 4 :(得分:1)

因为Java中的所有类本身都扩展了Object类。类A将继承Object#equals方法。假设您没有像在example中那样明确实现equals方法时强制编译错误。使equals方法抽象而不使用实现块将使您能够执行此操作。