快速业务通道

对Java多态性综合运用的探讨 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
:"in B.protectedTest(Object).." 经过上面的解释,想必大家都能很清楚的知道为什么会有这两个输出结果了:a2.protectedTest(helloObj);因为jvm的late-binding,所以在run-time的时候,调用了B类的方法,虽然在编译期间a2只是一个父类A的引用类型。

困惑7:

a2.protectedTest(helloStr); 为什么这里会输出" in A.protectedTest(Object)…"。为什么这里不会编译出错?为什么b1. protectedTest(helloStr)会出错而a2. protectedTest(helloStr)会出错?我调用了a2.equals(b1)和a2==b1得到的结果都是true啊?但是为什么这里出这个错误?

在这里,这个问题是最关键的,也是我们放到最后来解答的原因。

首先,回顾一下equals()和==的在java里面的概念,记得有一道scjp的题目:

题目:下面的哪些叙述为真。

A. equals()方法判定引用值是否指向同一对象。

B. == 操作符判定两个分立的对象的内容和类型是否一致。

C. equals()方法只有在两个对象的内容一致时返回true。

D. 类File重写方法equals()在两个分立的对象的内容和类型一致时返回true。

答案是AD,严格来说这个问题的答案是不确定的,因为equals()方法是可以被重载的,但是如果新类没有重写equals(),则该方法在两个变量指向同一对象时返回真. 实际上java也是推荐的是使用equals()方法来判断两个对象的内容是否一样,就像String类的equals()方法所做的那样,判定两个String对象的内容是否相同。而==操作符返回true的唯一条件是两个变量指向同一对象。

在这里,我们不再深入的讨论关于equals()和==的区别和概念。我们只需要知道,在我们的例子里面,无论是equals()和==都是一个含义-就是引用值是否指向同一个对象(因为我们并没有重写equals()).

显然,我们在进行了a2=b1.这一步之后,a2和b1都是指向同一个对象。

既然指向同一个对象,为什么还要区别对待a2和b1?为什么a2就没有编译错误,而b1就要遇到reference ambiguous错误?

我们现看看jvm规范里的一段话:

"The Java Virtual Machine does not require any particular internal

structure for objects. In Sun''s current implementation of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the Java heap for the object data."

实际上就是说:在java虚拟机中,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:一个指针指向一张表格,实际上这个表格也有两个指针:一个指针指向一个包含了对象的方法表,另外一个指向类对象;另一个指针指向一块从java堆中为分配出来内存空间。

那么,在a2=b1的时候,到底发生了什么?

实际上,在a2=b1的时候,仍然是存在两个句柄,a2和b1,但是a2和b1拥有同一块数据内存块和不同的函数表。所以在a2.protectedTest(helloStr)的时候,jvm会从a2的函数表里找到protectedTest(String Str)方法,但是b1.protectedTest(helloStr)却会出现编译错误,因为jvm从b1的函数表里找不到,然后就选择自己上溯造型还是参数上溯造型出现了ambiguous。这也是我们对这个问题的精确解释。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号