接口是否从 Java 中的 Object 类继承

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

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

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


interface Employee {
}
32905 次浏览

根据定义,实现任何接口的任何类也都是从 Object派生的。

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

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

另一种看法是:

interface MyInterface {
// ...
}


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

这里的强制转换 (Object) param总是有效的,这意味着每个接口类型都是 java.lang.Object的子类型。

这是因为 employee e = ...读取到有一个类 工具employee,并被赋予变量 e。实现接口的每个类都隐式地扩展 Object,因此当您执行 e.equals(null)时,该语言知道您有一个类是 employee的子类型。

JVM 将为您的代码执行运行时检查(即抛出 NullPointerException)。

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

但是,接口不是 implementsextends“继承”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

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

不,他们没有。对于 matter.(*),所有接口都没有隐式继承的公共“ root”接口(类的情况就是如此)

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

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

这在 Java 语言规范 9.2接口成员中有详细解释。

9.2接口成员

[...]

  • 如果接口没有直接超接口 然后,接口隐式地声明了一个带有签名的公共抽象成员方法 < em > m ,返回类型 < em > r ,并使用签名 < em > s 对应于每个公共实例方法 m 抛出子句 < em > t ,返回类型 < em > r ,并使用 Object中声明的抛出子句 < em > t ,除非接口显式声明了具有相同签名、相同返回类型和兼容的 throw 子句的方法。

[...]


这篇文章已被改写为文章 给你


(*)注意,作为 亚型的概念不等同于 继承自: 没有超级接口的接口确实是 Object(4.10.2. 类和接口类型之间的子类型化)的子类型,即使它们不是从 Object继承的。

是接口继承的对象类,我们如何能够通过接口类型引用访问对象类的方法
No Interface 不继承 Object类,但它提供了对 Object类的所有方法的可访问性。 接口的成员是: < br >

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly

声明对应于在 Object 中声明的每个公共实例方法的公共抽象成员方法。如果在 Object中 m 被声明为 final的情况下,接口显式地声明了这样一个方法 m,那么这是一个编译时错误。

现在很清楚,所有超接口都具有与 Object中声明的每个 public实例方法对应的 abstract成员方法。

来源: Http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

类、枚举、数组和 接口都是引用类型。

引自: 《 http://docs.oracle.com/javase/tutorial/reflect/class/index.html 》 第二句要说清楚。

接口不能也不能扩展 Object 类,因为接口必须具有公共和抽象方法。

对于 Object 类中的每个公共方法,在接口中都有一个隐式公共和抽象方法。

这是标准的 Java 语言规范,

如果一个接口没有直接的超级接口,那么这个接口就会隐式地声明一个带有签名 s 的公共抽象成员方法 m,返回类型 r,然后抛出对应于每个带有签名 s 的公共实例方法 m 的子句 t,返回类型 r,然后抛出在 Object 中声明的子句 t,除非这个接口显式地声明了一个具有相同签名、相同返回类型和兼容的抛出子句的方法。”

在类文件中找不到编译插入的对象声明的方法。未获得元类信息的对象的方法名称在运行时反映出来。根据官方描述,对象的方法签名是隐式扩展的,这可能是 JVM 运行时机制所允许的