Sya*_*m S 24 java abstract-class interface
我已经了解了接口和抽象类之间的区别,但这个令人困惑.考虑这个接口和类.
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不是抽象类的超类?或者我错过了一些观点?
Dav*_*ton 33
它导致编译错误,因为根据定义,抽象函数必须在继承链的下游实现.您已经创建了必须在子类中实现的要求A.
类C没有实现那些方法,所以编译失败.
Object是抽象类的超类......但它不是子类,子类负责实现抽象函数.
相反,如果一个类实现了一个接口,那么该实现可以存在于该类的继承层次结构中的任何位置.将这些实现放在超类中并不常见,因为您通常会在超类中声明接口.
有些用例你可能没有,比如堕落/糟糕的设计,或类似于这样的例子,同时探讨语言功能.
正如其他人已经提到的那样,类通过将它们再次声明为抽象来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
}
在这种情况下,两个A和C继承这些方法的实施Object,并没有发生编译错误.
| 归档时间: | 
 | 
| 查看次数: | 3145 次 | 
| 最近记录: |