接口是否继承了Java中的Object
类?
如果不是那么我们如何能够在接口实例
上调用对象类的方法public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
答案 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]
但是,界面不会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
答案 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 子句的方法。”