pon*_*nds 145 java inheritance interface
接口是否继承自ObjectJava中的类?
如果没有那么我们如何能够在接口实例上调用对象类的方法
public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
Run Code Online (Sandbox Code Playgroud)
aio*_*obe 152
接口是否继承自
ObjectJava中的类?
不,他们没有.并且没有共同的"根"接口被所有接口隐式地继承(就像在类的情况下那样).(*)
如果没有那么我们如何能够在接口实例上调用对象类的方法
接口隐式声明了每个公共方法的一个方法Object.因此,该equals方法被隐式声明为接口中的成员(除非它已经从超接口继承它).
这在Java语言规范,第9.2节接口成员中有详细解释.
9.2接口成员
[...]
- 如果接口没有直接的超接口
Object,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m ,返回类型r和throws子句t声明在,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法.[...]
该帖子已被改写为一篇文章在这里.
(*)请注意,作为子类型的概念不等于继承自:没有超级接口的接口确实是Object(第4.10.2节.类和接口类型之间的子类型)的子类型,即使它们不继承Object.
fin*_*nnw 12
每个.class文件中都有一个超类字段,包括代表接口的字段.
对于它总是指向的接口java.lang.Object.但这并不是用于任何事情.
另一种看待它的方法是:
interface MyInterface {
// ...
}
public myMethod(MyInterface param) {
Object obj = (Object) param;
// ...
}
Run Code Online (Sandbox Code Playgroud)
这里的强制转换(Object) param总是有效的,这意味着每个接口类型都是一个子类型java.lang.Object.
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
那是因为employee e = ...读取到有一个实现 的类employee,并分配给了变量e。每个实现接口的类都隐式地扩展了 Object,因此当你这样做时e.equals(null),语言知道你有一个类是 的子类型employee。
JVM 将对您的代码进行运行时检查(即 throw NullPointerException)。