散分贴,关于interface和Object关系的思考!
其实这个问题讨论起来没什么意义,不过大半夜睡不着,写点东西散个分.
下面是一个最简单的interface:
interface I {}
这个 I 和 Object 到底有什么关系呢?
问题一:
public class T {
public static void main(String[] args) {
I i;
}
}
上面一个简单的类,用eclipse的时候在I i;下面面输入 "i. "会出现Object的方法列表.
显然即时编译器编译通过了才会出现这种结果.为什么?
问题二:
interface Test {
public int toString();
}
接口改成上面这个样子.编译后有如下错误:
Test.java:2: Test 中的 toString() 无法覆盖 java.lang.Object 中的 toString();正在尝试使用不兼容的返回类型
找到: int
需要: java.lang.String
public int toString();
^
1 错误
问题三:
再改改这个接口:
interface Test {
public void wait();
}
编译后有如下错误:
Test.java:2: Test 中的 wait() 无法覆盖 java.lang.Object 中的 wait();被覆盖的方法为 final
public void wait();
^
1 错误
要回答这三个问题,就先要回答interface和Object的关系.
从java程序设计语言的角度上将interface不是类,而Object是所有类的最终超类.
所以从这里看interface和Object没有必然联系.
但是看看java language specification中怎么说:
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. It is a compile-time error if the interface explicitly declares such a method m in the case where m is declared to be final in Object.
It follows that is a compile-time error if the interface declares a method with a signature that is override-equivalent (§8.4.2) to a public method of Object, but has a different return type or incompatible throws clause.
简单的说就是:
如果接口没有直接超接口,那么该接口会隐式声明一些public abstract的方法,这些方法和Object中的public方法具有对应的方法签名,返回类型,异常列表.
如果在接口中显示声明了Object中的final的方法,报错.
如果在接口中声明的方法和Object中的方法具有相同的方法签名,但是返回类型不同或者异常列表不相容,报错.
按照上面的说法,给与了前三个问题合理的解释.
interface不是类,与Object的关系更谈不上继承.但它和Object的关系密切,它将Object的public方法都声明为了abstract.
但是问题并没有就此结束...
还是这个interface I {}
编译后javap -verbose看看:
常量池Constant pool:
const #1 = class #5; // I