快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
传给基本类型的参数包裹类对象

JFrame frame = new JFrame("^_^"); frame.setSize(320, 200); frame.setVisible(new Boolean(true));

把包裹类对象往基本类型上强制转化时。例如在一个Long型的数据前面加上(long)。

清单15:从包裹类对象到基本类型的强制转化

Long l = new Long(31415L); System.out.println((long) l);

把包裹类对象当作运算符的操作数时。例如在两个Byte型的数据之间放上“+”号。

清单16:把包裹类对象当作运算符的操作数

Byte a = new Byte((byte) 1); Byte b = new Byte((byte) -1); System.out.println(((a++) << 2) + (~b));/* 输出“4” */ System.out.println(a);/* 输出“2” */

用包裹类对象来指定数组的大小时。当然,从语义上说,这个对象的类型必须是Byte、Short、Integer或Character。

清单17:用包裹类对象来指定数组的大小

Character size = new Character(''★'');/* Unicode: 9733 */ int[] integers = new int[size];/* 生成一个可放9733个int元素的数组 */

把包裹类对象在switch语句里使用时。当然,从语义上说,这个对象的类型必须是Byte、Short、Integer或Character。

清单18:在switch语句里使用包裹类对象

Character c = new Character(''a''); switch (c) { case ''a'': case ''e'': case ''i'': case ''o'': case ''u'': System.out.println("A Vowel in English"); break; default: System.out.println("Not A Vowel in English"); break; }

把Boolean对象在if/for/while/do-while语句中作为条件表达式使用时。

清单19:把Boolean对象作为条件表达式

Boolean bool = new Boolean(Math.random() > 0.5); if (bool) { System.out.println("Aye!"); } else { System.out.println("Nay!"); }

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

时间:2010-07-08

6. Auto-Unboxing的局限

Auto-Unboxing的机制则有这样一个局限——只能把包裹类对象往它们对应的基本类型(以及容纳范围更广的类型)上转化。

类似这样的代码是不能工作的,尽管32并未超出byte所能表示的范围:

清单20:不能同时进行Auto-Unboxing和强制向下转型

Integer i = new Integer(32); System.out.println((byte) i);/* 编译时出错 */

这是因为编译器并不认可同时进行Auto-Unboxing和强制向下转型的操作,所以这个转化无法进行。如果一定要进行这种操作,需要手工补充一次转型:

清单21:需要先作Unboxing,再强制向下转型

Integer i = new Integer(32); System.out.println((byte)(int) i);

不过同时进行Auto-Unboxing和强制向上转型的操作是没有问题的,所以下面的代码工作得很正常:

清单22:可以同时进行Auto-Unboxing和强制向上转型

Integer i = new Integer(32); System.out.println((double) i);

7. 其它不能自动转化的情况

除去强制类型转化时的限制之外,还有这样一些情况下不会发生Autoboxing/Auto-Unboxing:

1. 基本类型的数组和包裹类数组之间不会自动转化。这样的代码完全不被编译器接受:

清单23:元素可以,容器不行

int[] ints = {1, 2, 3}; Integer[] integers = ints;/* 编译时出错 */

2. 不能对着基本类型的表达式来调用包裹类里的方法。这样的申请会被编译器彻底拒绝:

清单24:没有方法,就是没有方法

int i = 1; byte b = i.byteValue();/* 编译时出错 */

8. null的转化问题

Java里的引用类型可以有一个特别的取值——“null”。试图对null进行Auto-Unboxing操作会导致一个“NullPointerException”。

例如这段代码就会在运行时抛出异常,尽管在编译

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