Java中的接口和抽象类
Posted
技术标签:
【中文标题】Java中的接口和抽象类【英文标题】:Interfaces and Abstract Classes in Java 【发布时间】:2014-04-23 13:04:49 【问题描述】:Java 中的接口和抽象类是否扩展了 Object 基类?我能想到的逻辑答案是否定的,但是如果接口没有扩展 Object 类,那么请有人解释一下下面的代码:
interface A
@Override
public int hashCode();
@Override
public String toString();
在上述情况下,A 接口是声明的新接口。然而,没有一个类正在实现它。那么 Object 类的方法是如何在界面中可见的呢?
如果它不扩展 Object 类,那为什么我不能在接口中声明以下方法:
public Class getClass();
当我试图在接口中声明这个方法时,它说它不能覆盖这个继承自 Object 类的方法,因为它在 Object 类中被声明为 final 方法。
【问题讨论】:
***.com/questions/13776018/… 【参考方案1】:接口只能扩展一些其他接口并且没有 - 没有一些根接口。抽象类与 Java 中的任何其他类一样,都将 Object 作为其祖先——虽然它可能不是直接的父类。
标记为 final 的方法无法在后续类中被覆盖。由于您的类将 Object 作为其祖先 - 此规则也适用于此。
【讨论】:
【参考方案2】:原因可以在JLS $9.2找到
如果一个接口没有直接的超接口,则该接口隐式声明一个公共抽象成员方法 m,签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s,返回类型为 r 的公共实例方法 m,并且在 Object 中声明 throws 子句,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。
在 Object 中声明 m 为 final 的情况下,如果接口显式声明了这样的方法 m,则属于编译时错误。
如Object#getClass
:
public final Class<?> getClass()
接口不继承自Object
,但它们确实通过隐式添加它们来模仿可用的方法。同样,该基接口中的final
方法不能在您的自定义接口中被覆盖。
【讨论】:
以上是关于Java中的接口和抽象类的主要内容,如果未能解决你的问题,请参考以下文章