Java中的接口和抽象类是否扩展了基础Object类?我能想到的逻辑答案是否定的,但是如果接口没有扩展Object类,那么可以请有人解释下面的代码:
interface A {
@Override
public int hashCode();
@Override
public String toString();
}
在上面的例子中, A 接口是声明的新接口。然而,没有一个班级正在实施它。那么为什么Object类中的方法在界面中可见?
如果它没有扩展Object类,那么为什么我不能在接口中声明以下方法:
public Class getClass();
当我尝试在接口中声明此方法时,它表示它无法覆盖从Object类继承的此方法,因为它在Object类中被声明为final方法。
答案 0 :(得分:1)
接口只能扩展其他一些接口而不能 - 没有一些根接口。抽象类与Java中的任何其他类一样,将Object作为其祖先 - 虽然它可能不是直接父级。
标记为 final 的方法无法在后继类中重写。由于您的类具有Object作为其祖先 - 此规则也适用于此处。
答案 1 :(得分:0)
可以在JLS $9.2
中找到原因如果接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型为r, throws在Object中声明的子句t,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。
如果接口在将对象声明为m的情况下显式声明了这样的方法m,那么这是一个编译时错误。
如Object#getClass
中所示:
public final Class<?> getClass()
接口 继承自Object
,但他们做通过隐式添加它们来模仿可用的方法。同样,此基本接口中的final
方法无法在您自定义的界面中被覆盖。