1、启航(公元2009年大年初二22:51:08):
编译器过程大致如下(细节过程略):
从main方法开始, 在堆空间里创建类B的对象,然后栈空间里分配一个类型为A的引用;
接下来返回B类对象的堆空间地址给A的引用,这样一来A的引用就指向B的对象
A test = new B();
接下来在编译期,编译器首先检查接口A中是否有print方法,如果没有报错
接口A中未声明print方法,故test.print(); 会报错
2、中途遇险(公元2009年大年初二23:21:17):
问题的发现: 接口A的引用调用了Object类中的方法
首先,接口是无法继承类的,所以接口和Object是相对独立的,但是这里存在
一个问题就是接口A的引用为什么可以调用Object中的方法呢?
3、险中生还(公元2009年大年初二23:43:54)
问题解释:
接口A中既然不能继承类Object,但是并不能证明接口A里没有声明Object中的
同名方法,也就是说接口A中有一套跟Object类中同名的抽象方法,这就能够
解释的通为什么接口A的引用能够调用Object类中的方法,但是考虑到可重用性
所以有个隐藏的接口里面声明了Object类中的所有的方法,而接口A隐式的
继承了这个隐藏的接口,这样一来凡是接口都有一套Object类中的相同的方法。
接下来分析一下,接口A调用了Object中的方法,具体情况如下:
在编译期,如上所说接口A里面继承了隐藏的接口,那么toStsring()方法也在接口
A声明,这些一系列动作只不过是由编译器来完成。既而能在A中找到toString()方
法,从而编译期不会报错。
在运行期,因为每个类都继承了Object,那么类B就继承了Object里面的方
法,由于多态机制,接口A的引用会调用实现类B里面的toString方法。
4、成功登陆(公元2009年大年初三0:11:21)
问题解释的验证:
在编译期,首先看看接口A是否有print方法没(没有报错),然后在看看它的实现
类C里有没有实现接口A里的所有方法(没有也报错),因为类C继承了类B,
那么类C也就有了print方法,故没有报错
在运行期,因为实现类C继承了类B,所以会调用类B里面的方法
5、发现新大陆(公元2009年大年初三00:49:20)
总结:
通过上面的验证,可以得出以下结论:
厂家A 制定了一套图纸,车子有轮子, 那么这个任务就交给厂家C来实现,
而厂家C是直接把这个实现交给已经实现好"轮子"的厂家B,那么厂家C只需要
直接跟厂家B达成一定的协议(即继承B就可以了)就可以拥有该实现好的"轮子",
而不需要自己在去制造轮子(除非对厂家B的轮子有新得改进,即java中的重写)。
以上属个人理解,如有问题请加 QQ:472854157(四明狂客)