快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

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

时间:2010-12-15

或许大家java的多态问题,对上溯,下溯造型有了一定的概念,对protect和private大家想必也很清楚,但是,这几个个结合在一起,往往令人产生很多困惑,在这里,我举一个例子,大家或许会发觉这篇文章对你来说还是很有意义的:

例子一共有两个class. 可能出现困惑的地方我都会在后面一一解释。

A是一个父类,B继承A,并且实现了protectedTest(Object obj)方法.如下面所示:

B.java的源代码:

package cn.org.matrix.test; import cn.org.matrix.test.A; /** * <p>Title: protect, private and upcasting </p> * <p>Description: email:chris@matrix.org.cn</p> * <p>Copyright: Matrix Copyright (c) 2003</p> * <p>Company: Matrix.org.cn</p> * @author chris * @version 1.0,who use this example pls remain the declare */ public class B extends A { protected int protectedb = 0; protected int protectedab = 0; protected void protectedTest(Object obj) { System.out.println("in B.protectedTest(Object):" + obj); } }

A.java的源代码:

package cn.org.matrix.test; import cn.org.matrix.test.B; /** * <p>Title: protect, private and upcasting </p> * <p>Description: email:chris@matrix.org.cn</p> * <p>Copyright: Matrix Copyright (c) 2003</p> * <p>Company: Matrix.org.cn</p> * @author chris * @version 1.0,who use this example pls remain the declare */ public class A { protected int protecteda = 0; protected int protectedab = 0; private void privateTest() { System.out.println("in A.privateTest()"); } protected void protectedTest(Object obj) { System.out.println("in A.protectedTest(Object):" + obj ); } protected void protectedTest( String str ) { System.out.println("in A.protectedTest(String):" + str); } public static void main (String[] args) { // Test A A a1 = new A(); a1.privateTest(); // Test B String helloStr = "Hello"; Object helloObj = helloStr; B b1 = new B(); A a2 = b1; // 这里发生了什么?困惑1 b1=a1; //编译错误,困惑2 b1. privateTest(); //编译错误,困惑3 b1.protectedTest(helloObj); //输出结果?困惑4 b1.protectedTest(helloStr); //编译错误,困惑5 a2.protectedTest(helloObj); //输出结果? 困惑6 a2.protectedTest(helloStr); //输出结果?困惑7 ? } }

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

时间:2010-12-15

下面,我来逐个解释每一处困惑的地方:

困惑1:

这里其实就是子类自动上溯造型到父类A。这里a2其实是指向了一个B类型的对象. 我们通常都可以这样作: A a2=b1, 这样作的意思实际上就是让a2指向了一个类型B的对象-在这里就是b1了。

在java里面,关于跨类引用,有两条规则应该记住:

1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

所以,根据这两个规则,我们就不难理解例子中的A a2 = b1是什么意思了。

困惑2:

A a2 = b1是可以的,但是为什么b1=a1却是不行? 在这里,我们依然可以套用上面的两条规则,我们可以看到,b1是类B的一个引用,a1既不是类B的实例,也不是类B的子类的实例,所以直接b1=a1就出现了编译错误.

如果确实需要进行这样的转化,我们可以这样作:b1=(B)a1; 进行强制转化,也就是下溯造型. 在

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