南京北大青鸟南京中博
徐州开发校区 | 南京测试校区 | 中博社区 | 博客 | 中博IT教育 | 软件名城南京
  
 
在线咨询
 
 
 
中心简介
校区简介
校区环境
周边景点
关于北大青鸟
特色优势
常见问题解答
 
 
ACCP软件工程师课程
什么是ACCP
ACCP5.0课程介绍
各课程定位与介绍
各阶段课程
教学模式
ACCP5.0课程体系
ACCP5.0认证证书
 
 
  开班信息  
 
 
讲座试听
 
您的位置:阅读信息
JDK6新特性系列——编译器蜜糖
作者:中博IT教育  出处:中博IT教育  日期:2010-01-19 09:58:44
北大青鸟 - 南京北大青鸟首席软件工程师培训机构 全国免费咨询热线:400-885-5191(我要就业) 校址:南京市白下区建邺路66号3层 (张府园地铁3号出口)

从今天开始,我们来了解JDK6给我们带来的新特性,希望对大家以后的开发有所帮助

基本数据类型的自动装箱、拆箱是自J2SE5.0开始提供的功能,虽然打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,这就是方便的代价。

Java中,所有要处理的东西几乎都是对象,例如String,然而基本数据类型不是对象,也就是使用intdoubleboolean等定义的变量。而使用Java有一段时间的人都知道,有时需要将基本类型转换为对象,例如使用List添加元素时,需要传入的参数是对象而不是基本数据类型。

传统的编程模式中,要使用以下语句才能将int包装为一个Integer对象:

Integer integer=new Integer(10);

JDK5之后提供了自动装箱的功能,可以直接使用以下语句打包基本数据类型:

Integer integer=10;

在进行编译时,编译器再自动根据书写的代码,判断是否进行自动装箱动作。而且同样的动作可以适用于booleanbyteshortcharlongfloatdouble等基本数据类型。

这种自动装箱(autoboxing)、拆箱(unboxing)的功能就被美其名曰:编译器蜜糖

下面这段代码程序就是直接使用自动装箱功能来编写的:

Integer num=100;  //自动装箱

     System.out.println (num/5);    //自动拆箱,输出结果为20

自动装箱运用的方法还可以如下:

int i=10;

Integer integer=i;

也可以使用更一般化的java.lang.Number类来自动装箱。例如:

    Number number=3.14f;

3.14f会先被自动装箱为Float,然后制定给number

JDK5开始可以自动装箱,也可以自动拆箱,也就是将对象中的基本数据形态信息从对象中自动取出,例如:

Integer integer=10;

int num=integer;

在运算时,也可以自动拆箱

Integer i=10;

System.out.println(i + 10);

System.out.println(i++);

布尔类型也可以自动拆箱

Boolean boo=true;

System.out.println(boo && false);  //自动拆箱,显示false

注意:虽然自动装箱与自动拆箱很方便,但是程序运行阶段您得了解Java的语义,例如下面的程序是可以通过编译的:

Integer i=null;

int j=i;

这样的语法在编译时期是合法的,但是在运行的时候会有错误,因为这种写法相当于:

Integer i=null;

int j=i.intValue();

所以运行时会产生NullPointerException异常。

自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心,再来看一个程序:

Integer num1=100;

Integer num2=100;

System.out.println(num1==num2);

你认为输出的结果是什么呢?没错,就是true。下面我们把代码改一改

Integer num1=200;

Integer num2=200;

System.out.println(num1==num2);

输出的结果却是false,这有些另人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。

其实这个==运算符有关,我们都知道==是用于判断两个对象的内存地址是否相同,也就是两个引用名称是否参考一个对象。

自动装箱的时候,对于值从-128127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以第一个程序在比较时,为true,如果超过了这个范围,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以比较后的结果为false

所以要记住:在内存中,只有单字节的数据装箱后才能重用,否则不会重用。

最后,我们通过一个示例程序再来印证一下这个理论

    Character ch1='A';

Character ch2='A';

System.out.println (ch1==ch2); //打印true,因为数值A为单字节ASCII码字符集数据

Character ch1='';

Character ch2='';

System.out.println (ch1==ch2); //打印false,因为汉字马为双字节Unicode字符集数据

返 回
下一篇:DOJO基础
 
北大青鸟全国免费服务电话:400-885-5191(我要就业)    苏ICP备08102142号
南京(软件开发)校区地址:南京市白下区建邺路66号3层(张府园地铁3号出口) 咨询电话:025-84200066 
徐州(软件开发)校区地址:徐州市解放南路181号北大青鸟中博(六中对面) 咨询电话:0516-85628888
南京(软件测试)校区地址:南京市中山南路89号江苏文化大厦22F 咨询电话:400-887-5191 
中博教育客服在线
  蒋老师
蒋老师
唐老师
唐老师
郭老师
郭老师
  徐老师
徐老师
陆老师
陆老师
 
 


学费咨询
学历咨询
专业咨询
订座试听
就业咨询
课程咨询
软件认证
网络认证