问题
接口是否继承自Java中的Object
class?
如果没有那么我们如何能够在接口实例上调用对象类的方法
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