接口是否继承自java中的Object类

时间:2011-05-19 08:58:06

标签: java inheritance interface

接口是否继承了Java中的Object类?

如果不是那么我们如何能够在接口实例

上调用对象类的方法
public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

8 个答案:

答案 0 :(得分:148)

  

接口是否继承了Java中的Object类?

不,他们没有。并且没有任何共同的“根”接口被所有接口隐式继承(如类的情况)。(*)

  

如果没有那么我们如何能够在接口实例上调用对象类的方法

接口为Object中的每个公共方法隐式声明了一个方法。因此,equals方法被隐式声明为接口中的成员(除非它已经从超接口继承它)。

Java语言规范§ 9.2 Interface Members中详细解释了这一点。

  

9.2接口成员

     

[...]

     
      
  • 如果接口没有直接的超接口,则接口隐式声明带有签名 s 的公共抽象成员方法 m ,返回类型 r < / em>,并且使用签名 s ,返回类型 r 和throws子句对应于每个公共实例方法m的throws子句 t t Object 中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。
  •   
     

[...]


此帖子已被重写为文章here


(*)请注意,作为 子类型的概念并不等同于继承自:没有超级接口的接口确实是{{}的子类型1}}(§ 4.10.2. Subtyping among Class and Interface Types ),即使它们不是从Object继承。

答案 1 :(得分:11)

每个.class文件中都有一个超类字段,包括代表接口的字段。

对于界面,它始终指向java.lang.Object。但这并没有用于任何事情。

另一种看待它的方法是:

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

此处,强制转换(Object) param始终有效,这意味着每个接口类型都是java.lang.Object的子类型。

答案 2 :(得分:9)

Object是任何接口[1]

的超类型

但是,界面不会implementsextends“继承自” Object

JLS有一个特殊的子句,可以将Object方法添加到接口[2]

[1] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[2] http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2

答案 3 :(得分:4)

这是因为employee e = ...读取有一个实现 employee的类,并被分配给变量e。实现接口的每个类都隐式地扩展了Object,因此当你执行e.equals(null)时,语言知道你有一个类employee的类。

JVM将对您的代码进行运行时检查(即抛出NullPointerException)。

答案 4 :(得分:3)

接口是否继承Object类,如何通过接口类型引用访问对象类的方法
No Interface不会继承Object类,但它为Object类的所有方法提供了可访问性。 界面的成员是:

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

声明与Object中声明的每个公共实例方法对应的公共抽象成员方法。
如果接口显式声明了这样的方法,则是编译时错误m在final中声明为Object的情况下。

现在很明显,所有超接口都有abstract成员方法,对应于public中声明的每个Object实例方法。

源: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

答案 5 :(得分:0)

任何实现任何接口的类也都来自Object以及定义。

答案 6 :(得分:0)

引用类型都继承自java.lang.Object 。类,枚举,数组和接口都是引用类型。

引自:http://docs.oracle.com/javase/tutorial/reflect/class/index.html 第二句要明确。

答案 7 :(得分:0)

接口不能也不能扩展 Object 类,因为接口必须有公共和抽象方法。

对于 Object 类中的每个公共方法,接口中都有一个隐式的公共和抽象方法。

这是标准的 Java 语言规范,声明如下,

<块引用>

“如果一个接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,签名为s,返回类型r,并抛出子句t对应每个签名为s的公共实例方法m,返回类型为r , 和在 Object 中声明的 throws 子句 t ,除非接口显式声明了具有相同签名、相同返回类型和兼容的 throws 子句的方法。”