抽象类是否扩展对象?

2022-09-01 17:08:20

我已经读过接口和抽象类之间的区别,但这个令人困惑。请考虑此接口和类。

interface I {
    public int hashCode();
    public boolean equals(Object obj);
}

class B implements I {
    // Works Fine
}

在这里,它工作正常,我不需要重写接口方法,因为Object是B的超类,这些方法在其中实现。

现在考虑这些

abstract class A {
    public abstract int hashCode();
    public abstract boolean equals(Object obj);
}

class C extends A {
    // Compile error because methods are not overridden
}

为什么这会导致编译错误?这是否意味着 Object 不是抽象类的超类?还是我错过了一些要点?


答案 1

它会导致编译错误,因为根据定义,抽象函数必须在继承链的下游实现。您已经创建了必须在 的子类中实现它们的要求。A

类不实现这些方法,因此编译失败。C

Object是抽象类的超类...但它不是子子类负责实现抽象函数。

相反,如果一个类实现了一个接口,则该实现可以位于该类的继承层次结构中的任何位置。将这些实现放在超类中不太常见,因为您通常会在超类中声明接口。

有些用例你可能不会,比如退化/糟糕的设计,或者在浏览语言功能时出现这样的示例。


答案 2

正如其他人已经提到的,class 通过再次将它们声明为抽象来重写这些方法,因此它强制子类实现它们。AObject

为了澄清您的情况,请尝试定义如下:A

abstract class A {
    //public abstract int hashCode();
    //public abstract boolean equals(Object obj);
}

class C extends A {
    // no compile error because no abstract methods have to be overridden
}

在这种情况下,两者都继承了这些方法的实现,并且没有发生编译错误。ACObject