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


157

接口是否从ObjectJava中的类继承?

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

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

interface Employee {
}

56
+1,好问题。
aioobe 2011年

@EJP,从技术上讲,java / io / Serializable.class包含什么都没有关系。我认为您将Java Lang Spec和JVM spec混淆了。
aioobe 2012年

@aioobe因为我没有提到这些规范中的任何一个,所以我不明白您的意思。Serializable是最简单的接口;javap在它上面运行会告诉您它继承了什么;这是由Java语言规范规定的。如果您认为JVM Spec包含在其中,请给我们启发。
罗恩侯爵

2
@EJP,问题是关于Java语言(即Java语言规范)的。java / io / Serializable.class包含的内容都与JVM规范所说的有关。从技术上讲,不能保证两个规范的特征之间存在一一对应的关系。
aioobe 2013年

我在最近的博客文章中对此进行了详细说明。
aioobe

Answers:


161

接口是否从ObjectJava中的类继承?

不,他们没有。而且,就此而言,也不存在所有接口都隐式继承的通用“根”接口(与类一样)。(*)

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

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

Java语言规范§9.2接口成员中对此进行了详细说明。

9.2接口成员

[...]

  • 如果接口没有直接超接口,则接口隐式地声明公共抽象成员方法与签名小号,返回类型- [R ,和throws子句对应于与签名中的每个公共实例方法米小号,返回类型- [R ,和throws子句在中声明Object,除非接口显式声明了具有相同签名,相同返回类型和兼容throws子句的方法。

[...]


这篇文章在这里已被重写为文章。


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


1
@aioobe如果我们实现任何接口,那么为什么不在实现该接口的类中给出“等于”方法的实现。根据我的概念,我们必须在实现类时实现接口方法,否则该类将是抽象的。
维卡斯·芒加尔

1
您不需要(重新)实现继承的方法。看这个例子。换句话说,已经定义了equals并继承了实现接口的类。
aioobe 2014年

3
我明白了这一点。但是有一个问题-为什么我们需要这个?如果Object不在接口中声明类的方法,将会有什么区别?
Vikas Mangal 2014年

2
如果我们没有这个,问题中的程序将无法编译。界面中有on equals方法Employee
aioobe 2014年

1
这个问题和答案仍然提醒我,即使有经验,我也应该专注于使自己的基础知识更强。
Anand j。Kadhi 2015年

13

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.lang.Object还将接受任何接口类型的引用。此外,您可以将接口强制转换为Object隐式,而不会出现任何编译器错误。
nme

12

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

对于接口,它始终指向java.lang.Object。但这没有用。

另一种查看方式是:

interface MyInterface {
    // ...
}

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

在此,强制转换(Object) param始终有效,这意味着每种接口类型都是的子类型java.lang.Object


4
.class文件是.java文件的构件。通过查看生成的.class文件来争辩某些东西在Java语言中起作用的原因是向后推理。
aioobe 2014年

对象obj =(对象)参数; 不会引发编译错误。但是MyInterface的方法(公共)对obj不可见。因此不能假设MyInterface是每个接口类型都是java.lang.Object的子类型
sabarinathan u

5

这是因为employee e = ...读取到有一个实现 的类employee,并将其分配给variable e。每个实现接口的类都隐式地扩展了Object,因此,当您这样做时e.equals(null),该语言会知道您拥有的子类型employee

JVM将对您的代码进行运行时检查(即throw NullPointerException)。


答案应遵循命名约定。
Lew Bloch

3

接口是继承对象类的对象,如何通过接口类型引用访问对象类的方法
否接口不继承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是被宣布为的情况finalObject

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

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


0

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


0

引用类型都继承自java.lang.Object。类,枚举,数组和接口都是引用类型。

引用自:http : //docs.oracle.com/javase/tutorial/reflect/class/index.html 要清楚的第二句话。


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types:没有说接口是从Object继承的。仅Classs,enums和arrays。
Number945 '18

他们更改了它:)
dalvarezmartinez1'1

即使“他们改变了它”(我对此表示怀疑),本教程也可能是错误的。规范性参考是Java语言规范(JLS)。
Lew Bloch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.