0%

Java接口是否继承Object类

我们知道Java具体类继承Object类,那么Java接口是否继承Object类?

一、看似继承

Java接口引用类型可访问Object类中“public”方法顺利通过编译,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package chapter9;

interface A {

}

public class InterfaceExtendsObjectIs {

void f(A a) {
System.out.println(a.hashCode());
System.out.println(a.toString());
}

}

二、实则不继承

Java接口类型不能进行实例化。如果Java接口继承Object类,那么“Java接口类型不能进行实例化”论断不再成立。

三、本质

根据“一、看似继承”和“二、实则不继承”,答案呼之欲出:Java接口不继承Object类,虚拟机制造了“继承的假象”。
在[1]中有下述一段说明:

1
If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.

因此,准确的描述是:

1
虚拟机会在顶层接口(没有父接口的接口)中自动定义一系列对应于Object类中“public”方法的虚方法,除非已经得到了显式定义,这点跟虚拟机会自动定义一个默认构造器类似。

3.1、顶层接口中自动定义的虚方法

参照Object类中的“public”方法,可知顶层接口中自动定义的虚方法如下:

1
2
3
4
5
6
7
8
public abstract int hashCode();
public abstract boolean equals(Object obj);
public abstract String toString();
public abstract void notify();
public abstract void notifyAll();
public abstract void wait(long timeout) throws InterruptedException;
public abstract void wait(long timeout, int nanos) throws InterruptedException;
public abstract void wait() throws InterruptedException;

3.2、方法定义冲突

在同一个具体类或者接口中,两个相同方法签名的方法定义,如果返回类型不同,就会造成冲突。
根据上面叙述可知,在顶层接口中定义有一系列对应于Object类中“public”方法的虚方法,因此,在顶层接口中显式定义与这些虚方法“具有相同方法签名,但具有不同返回类型”的虚方法会造成冲突,导致编译错误。
示例代码如下:

1
2
3
4
5
package chapter9;

interface B {
public abstract void toString();
}

编译错误提示信息如下:

1
'toString()' in 'chapter9.B' clashes with 'toString()' in 'java.lang.Object'; attempting to use incompatible return type

参考文献: [1]https://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.2
您的支持将鼓励我继续分享!