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

问题

接口是否继承自Java中的Objectclass?

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

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

#1 热门回答(132 赞)

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

不,他们没有。并且没有共同的"根"接口被所有接口隐式继承(就像在类的情况下那样)。(*)

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

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

这在Java语言规范§ 9.2 Interface Members中有详细解释。

9.2接口成员[...]如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m ,返回类型r和在Object中声明的throws子句t,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。 [...]

此帖已被重写为articlehere
(*)请注意,asubtype ofis的概念不等于以下:没有超级接口的接口确实是Object(§ 4.10.2. Subtyping among Class and Interface Types)的子类型,即使它们不继承自Object


#2 热门回答(9 赞)

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

对于接口,它总是指向java.lang.Object。但这并不是用于任何事情。

另一种看待它的方法是:

interface MyInterface {
    // ...
}

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

这里的cast(Object) param始终有效,这意味着每个接口类型都是java.lang.Object的子类型。


#3 热门回答(8 赞)

Object是任何接口的超类型[1]

但是,接口不是implements,extends,或者"继承自"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