接口是否inheritance自java中的Object类
接口inheritance自Java中的Object
类吗?
如果没有,那么我们如何能够在接口实例上调用对象类的方法
public class Test { public static void main(String[] args) { Employee e = null; e.equals(null); } } interface Employee { }
接口inheritance自Java中的
Object
类吗?
不,他们不。 而且对于这个问题,没有一个通用的“根”接口被所有接口隐式地inheritance(就像在类中一样)。 (*)
如果没有,那么我们如何能够在接口实例上调用对象类的方法
一个接口隐式地为Object
每个公共方法声明一个方法。 因此, equals
方法被隐式地声明为接口中的成员(除非它已经从超接口inheritance)。
这在“Java语言规范” 第9.2节“接口成员”中有详细的解释。
9.2接口成员
[…]
- 如果一个接口没有直接的超级接口 , 那么接口隐式地声明一个具有签名s的公共抽象成员方法m ,返回types为r ,并且抛出对应于每个具有签名s的公共实例方法m的子句t ,返回types为r ,并且抛出子句t在
Object
声明 ,除非具有相同的签名,相同的返回types和兼容的throws子句的方法由接口显式声明。[…]
这篇文章在这里被重写为一篇文章。
(*)请注意,作为子types的概念不等于inheritance :没有超类接口的接口确实是Object
子types( 第4.10.2节。类和接口types之间的子types ),即使它们不从Object
inheritance。
实际上,每个.class
文件中都有一个超类字段,包括那些表示接口的字段。
对于一个接口,它总是指向java.lang.Object
。 但是这不是用于任何事情。
另一种看待它的方法是:
interface MyInterface { // ... } public myMethod(MyInterface param) { Object obj = (Object) param; // ... }
这里cast (Object) param
总是有效的,这意味着每个接口types都是java.lang.Object
的子types。
Object
是任何接口的超types[1]
但是,接口不会implements
, extends
或从“inheritance” 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
的类,并被分配给variablese
。 每个实现接口的类都会隐式扩展Object,因此,当您执行e.equals(null)
,语言知道您有一个类是employee
的子类。
JVM将为您的代码执行运行时检查(即抛出NullPointerException
)。
Interface是否inheritance了Object类,如何通过接口types引用访问对象类的方法
没有接口不inheritanceObject类,但它提供了对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被声明为Object中的final的情况下,接口显式声明了这样的方法m,那么这是一个编译时错误。
现在很明显,所有的超级接口都有与在Object中声明的每个公共实例方法相对应的抽象成员方法。
来源: http : //ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
您正在调用实现接口的Object的equals方法。
任何实现任何接口的类也都是从Object
派生的。
“ 引用types全部从java.lang.Objectinheritance,类,枚举,数组和接口都是引用types。 ”
引用自http://docs.oracle.com/javase/tutorial/reflect/class/index.html第二句要清楚。;