快速业务通道

体验J2SE 1.5新特性之装箱和拆箱 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
期间会表现得非常正常:

清单25:表面上,只是普通的赋值

Integer i = null; int j = i;/* 运行时错误 */

这是因为这段代码实际上相当于:

清单26:实际上,是在试图调用null的方法

Integer i = null; int j = i.intValue();/* 运行时错误 */

而试图调用null的方法是一种不被虚拟机认可的行为。

如果没记住有关的规则

大部分违反了使用“Autoboxing/Auto-Unboxing”机制时,需要遵守的约束的代码,都会造成编译错误。因此,即使并未准确的记住有关的规则,也不难及时发现、改正。只有违背了“不能对null进行Auto-Unboxing操作”的限制时,引发的是运行时异常,需要特别小心。

体验J2SE 1.5新特性之装箱和拆箱(6)

时间:2010-07-08

9. 对重载的影响

Java支持“重载”的机制,允许在同一个类拥有许多名称相同而形参列表不同的方法。然后,由编译器根据调用时的实参来选择到底要执行哪一个。

Autoboxing/Auto-Unboxing机制的引入,稍微增加了一些作这种选择时要考虑的因素——因为可能会有一个方法,既有一个能接受一个Integer型参数的版本,又有一个能接受一个int型参数的版本,而Autoboxing/Auto-Unboxing机制能自动的把实参在这两种类型之间转化,光凭原有的判断规则,二者是难以取舍的。但是,因为同时有这两个版本的做法完全合情合理,又不能在这里给出一个“reference to 被调用的方法名 is ambiguous”的编译错误来推卸责任。这就需要增加一条新的判断规则。

这条新增的规则是,不用进行Autoboxing/Auto-Unboxing的版本,优先于需要进行Autoboxing/Auto-Unboxing的版本。

因此,在这种情况下具体选择哪一个,要看传递的实参最初是什么类型。

清单27:不用进行Autoboxing/Auto-Unboxing的版本优先

public class OverloadingTest { private static void testOverloading(int i){ System.out.println("int"); } private static void testOverloading(Integer i){ System.out.println("Integer"); } public static void main(String[] args) { int i = 1; Integer j = new Integer(1); testOverloading(i);/* 输出“int” */ testOverloading(j);/* 输出“Integer” */ } }

10. 值相等和引用相等

在Java语言中有两个不同的“相等”概念——值相等和引用相等。这样就有一个“两个值相等的基本类型数据,经过Autoboxing之后,得到的对象的引用是否相等”的问题。

在《JSR 201: Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import》中,对这个问题,是作了这样的规定:

If the value p being boxed is true, false, a byte, an ASCII character, or an integer or short number between -127 and 128, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

这意味着这个答案可能是“是”也可能是“否”,由被Autoboxing的数据的类型和取值来决定。因此在检测两个对象是否代表相同的值的时候,还是有必要调用equals()方法来进行。

不过在J2SDK 1.5 Beta 1和Beta 2里的实际情况,和这稍微有些出入,“Autoboxing之后得到相同的对象引用”的范围被缩小了:

清单28:原来的值相等,经过Autoboxing之后的引用可能相等,也可能不相等

boolean b = true; Boolean b1 = b; Boolean b2 = b; System.out.println(b1 == b2);/* 输出“true” */ char c = ''1''; Character c1 = c; Character c2 = c; System.out.println(c1 == c2

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