Java中的接口和抽象类

时间:2014-04-23 13:04:50

标签: java interface abstract-class

Java中的接口和抽象类是否扩展了基础Object类?我能想到的逻辑答案是否定的,但是如果接口没有扩展Object类,那么可以请有人解释下面的代码:

interface A { 

@Override 
public int hashCode(); 

@Override 
public String toString(); 

} 

在上面的例子中, A 接口是声明的新接口。然而,没有一个班级正在实施它。那么为什么Object类中的方法在界面中可见?

如果它没有扩展Object类,那么为什么我不能在接口中声明以下方法:

public Class getClass();

当我尝试在接口中声明此方法时,它表示它无法覆盖从Object类继承的此方法,因为它在Object类中被声明为final方法。

2 个答案:

答案 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方法无法在您自定义的界面中被覆盖。