抽象类是否扩展了Object?

Sya*_*m S 24 java abstract-class interface

我已经了解了接口和抽象类之间的区别,但这个令人困惑.考虑这个接口和类.

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

class B implements I {
    // Works Fine
}
Run Code Online (Sandbox Code Playgroud)

这里工作正常,我不需要覆盖接口方法,因为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
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ton 33

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

C没有实现那些方法,所以编译失败.

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

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

有些用例你可能没有,比如堕落/糟糕的设计,或类似于这样的例子,同时探讨语言功能.


Mic*_*Sim 6

正如其他人已经提到的那样,类通过将它们再次声明为抽象来A覆盖这些方法Object,因此它强制子类实现它们.

作为您的情况的澄清尝试定义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
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,两个AC继承这些方法的实施Object,并没有发生编译错误.