我们知道Java具体类继承Object类,那么Java接口是否继承Object类?
一、看似继承
Java接口引用类型可访问Object类中“public”方法顺利通过编译,示例代码如下:
1 | package chapter9; |
二、实则不继承
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 | public abstract int hashCode(); |
3.2、方法定义冲突
在同一个具体类或者接口中,两个相同方法签名的方法定义,如果返回类型不同,就会造成冲突。
根据上面叙述可知,在顶层接口中定义有一系列对应于Object类中“public”方法的虚方法,因此,在顶层接口中显式定义与这些虚方法“具有相同方法签名,但具有不同返回类型”的虚方法会造成冲突,导致编译错误。
示例代码如下:
1 | package chapter9; |
编译错误提示信息如下:
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