快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
java里面,上溯造型是自动进行的,但是下溯造型却不是,需要我们自己定义强制进行.

困惑3:

b1. privateTest();编译不通过? 这是很显然的,你可以回顾一下private的定义: 私有域和方法只能被定义该域或方法的类访问. 所以,在这里,b1不能访问A的方法privateTest(),即使b1是A的子类的实例.

请看下面的例子:

public class A { private int two(int i) { return i; } } class Test extends A { public static void main(String[] args) { System.out.println(A.two(3)); } }

System.out.println(A.two(3));这行编译出错,显然,因为private方法不能在这个类之外被访问。

而protected则不同,我们回顾一下protected的定义: 被保护的域或方法只能被类本身、类的子类和同一 程序包中的类所访问。

下面是一个错误使用protected的例子:

package cn.org.matrix.test; public class ProtectedTest { protected void show() { System.out.println("I am in protected method"); } } import cn.org.matrix.test.*; public class Test { public static void main (String[] args) { ProtectedTest obj = new ProtectedTest(); obj.show(); } }

因为访问权限问题,你会得到"show() has protected access in test.ProtectedTest"的出错信息.

对Java多态性综合运用的探讨(3)

时间:2010-12-15

困惑4:

b1.protectedTest(helloObj); 输出的是"in B.protectedTest(Object):…" 这到底是为什么呢? 为什么jvm能够确定是输出B的方法而不是A的方法? 这就和jvm的运行机制有关系了. 我们上面提到了,a1是一个A类型的引用,但是指向了一个B类型的实例. 在这里,如果jvm根据引用的类型-在这里就是A 来定义调用哪个方法的话,那么应该是调用A的protectedTest(helloObj).

然后实际上不是这样的,因为jvm的动态编译能力,jvm会在run-time来决定调用哪一个method,而不是在compile time. 也就是所谓的late-binding(run-time)和early-binding(compile-time).

困惑5:

b1.protectedTest(helloStr); 这里为什么会出现编译错误? 他可以调用类B的protectedTest(Object obj)方法啊,把helloStr上溯造型成一个object就行了啊..或者上溯造型到A然后调用A的protectedTest(helloStr)方法。

问题的根源就在于此了,既然有两种选择,jvm应该选择那一种?这种不确定性如果交给jvm来动态决定的话,势必带来程序的不确定性..虽然java在其他的一些地方也有类似的情形出现,比如static变量的循环定义造成的不确定性,但是,在这里,jvm还是在编译阶段就解决了这个问题。

所以,我们会在这一步遇到编译错误: "reference to protectedTest is ambiguous; both method protectedTest(java.lang.String) in mytest.A and method protectedTest(java.lang.Object) in mytest.B match at line 46.

在这里,我们遇到的是显式的reference ambiguous错误,但是,有时候,隐式的reference ambiguous却往往是更加的危险。

在这里,我举个例子:

父类的 源代码:

public super { private void test(int i, long j); { System.out.println(i+"and"+j); } }

子类的源代码:

public sub { private void test(long j, int i); { System.out.println(i+"and"+j); } }

子类和父类都用有相同名称的方法test,参数类型不同而已.这种情况下,编译可以被通过.

但是如果你在另外一个类中用到了如下代码:

Sub sb = new Sub();

sb.test(100, 3000);

你就会遇到编译错误,因为没有确定的指出3000的类型,所以造成reference ambiguous的错误了.

对Java多态性综合运用的探讨(4)

时间:2010-12-15

困惑6:

a2.protectedTest(helloObj);

输出结果分别是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号