在我们了解“自动装箱/拆箱”机制之前,首先让我们先来了解一下什么是“类包装器/基本类型包装类”,因为这一种机制的出现正是为了让我们从基本数据类型与类类型之间的转换工作解脱出来。
=========================Writed by Jack.Hao on 2011.01.20========================
一、类包装器
Java是一种面向对象的编程语言,但它同时也提供了基本数据类型(基本数据类型不是面向对象体系的一部分,也不继承自Object注:1),使用基本数据类型而不是对象,是出于性能方面的考虑:因此即使是最简单的计算,使用对象来处理,系统也销也比较大。尽管使用基本数据类型有性能上的好处,但有时我们必须要使用对象表示,例如不能将一个基本数据类型直接放入集合,必须要先将基本数据类型封装成对象才可以。(Java中所有的标准数据结构操作都是对象,而不是基本数据类型),为了处理这种需求,Java提供了类型包装器(type wrapper)。
Java提供的类型包装器有:Character、Byte、Short、Integer、Long、Float、Double和Boolean。大家从命名上不能看出各自对应的基本数据类型是什么。
1)Character包装器构造函数:Character( char char )获取值:char charValue() //返回封装的字符
2)数字包装器
所有的数字类型都继承自抽象类Number构造函数:Byte( byte b )Byte( String s )Short( short value)Short( String s )Integer( int i )Integer( String s )Float( float f )Float( String s )Double( double d )Double( String s )获取值:byte byteValue()short shortValue()int intValue()long longValue()float floatValue()double doubleValue()
3)Boolean包装器构造函数:Boolean( boolean boolValue) // 必须为true或falseBoolean( String boolValue ) // “true”为true,否则为false,不区分大小写获取值:boolean booleanValue() //返回对象的布尔值
注1:可能有人要说话了,Java不是号称Everything thing is an Object,但我只能说这是个意外......
=========================Writed by Jack.Hao on 2011.01.20========================
二、自动装箱/拆箱
在介绍“自动装箱/拆箱”机制前,先让我们来了解两个概念:1)装箱:将一个值封装成为一个对象的过程 Integer iobj = new Integer( 100 ) ;2)拆箱:从一个类型包装器中提取值的过程 int i = iobj.intValue() ;
注:拆箱、装箱的概念从Java第一个版本开始就存在,并不是Java1.5新特性,注意我们说的是“自动拆箱/拆箱”
从J2SE5将自动装箱/拆箱的概念引入到Java中。自动装箱:每当我们需要一种类型的对象时,基本数据类型就被自动封装到与它相同类型的包装器中,并返回
自动拆箱:当我们需要一个值时,这个被装箱到对象中的值就会被自动的提取出来,不需要我们手动去调用xxValue()方法。
自动装箱/拆箱机制的引入,大大简化了编程,免除了对值进行手工装箱/拆箱繁琐的工作,同时可以避免发生错误。而且,它对泛型有十分重要的作用。
自动装箱引入,不需要手工建立一个对象来包装一个基本类型,只需将一个基本类型直接赋值给类型包装器,Java会自动建立一个对象: Integer iob = 100 ; //auto-box 自动拆箱引入,只要将这个对象引用赋给一个基本类型变量即可:int i = iob ; //auto-unbox
1)方法中自动装箱/拆箱:自动装箱/拆箱会在传递一个参数给方法或者方法返回一个值时自动发生。 class AutoBox{ static int m( Integer v ){ return v ; } public static void main( String [] args ){ System.out.println( m(100 ) ; }}
2)表达式中的自动装箱/拆箱
Integer iob = new Integer( 100 ) ;++iob ;System.out.println( iob * 20 + 10 ) ;
3)布尔型及字符型的自动装箱/拆箱Boolean b = true ; //auto-boxif( b ) System.out.println( "true" ) ; //auto-unboxCharacter ch = 'x' ; //auto-boxchar ch2 = ch ; //auto-unbox当一个Boolean对象用作while、for、do...while条件表达式,它被自动拆箱为一个基本类型布尔值。
4)自动装箱/拆箱有助于避免错误发生
Integer iob = 1000 ;int i = iob.byteValue() ;System.out.println( i ) ; // -24,iob中的值能过调用byteValue()被自动拆箱,使存储在iob中的值1000被截取,得到垃圾数据-24通常,自动装箱总是生成一个正确的对象,而自动拆箱总是生成一个正确的值
5)关于自动装箱/拆箱建议
到此,可能有人会说了,既然Java可以自动装箱/拆箱,还要基本数据类型干什么,而将基本类型全盘抛弃。虽然不使用基本数据类型完全可以,但它比起使用基本数据类型来说,它的效率要低得多,原因是自动装箱/拆箱增加了额外的系统负担,而基本类型则不会。
所以,通常情况下,类型包装器只是在基本类型需要用对象表示的场合下才使用,毕竟自动装箱/拆箱并不是为了消除基本数据类型才被加入到Java中的。