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中的接口和抽象类的主要内容,如果未能解决你的问题,请参考以下文章

Java中的抽象类和接口

java—抽象类和接口有什么区别

Java抽象类和接口

java中的接口和抽象类的异同

java中抽象类和接口的区别?

Java中的接口和抽象类