接口是否继承自java中的Object类

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.

  • 即使在2013年阅读它,这个答案应该有更多的赞成.好东西 (6认同)
  • 我明白了这一点.但有一个问题 - 为什么我们需要这个呢?如果在接口中没有声明`Object`类的方法,它会有什么不同? (3认同)
  • 如果我们没有这个,问题中的程序将无法编译.在`Employee`界面中有`equals`方法. (2认同)

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.

  • .class文件是.java文件的工件.通过查看生成的.class文件来争论为什么某些东西在Java语言中工作是后向推理. (2认同)

irr*_*ble 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


Buh*_*ndi 6

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

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


jab*_*bal 0

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