J2SE 5.0新特性(四)自动装箱/拆箱

原创 2011年01月23日 23:14:00

    在我们了解“自动装箱/拆箱”机制之前,首先让我们先来了解一下什么是“类包装器/基本类型包装类”,因为这一种机制的出现正是为了让我们从基本数据类型与类类型之间的转换工作解脱出来。

=========================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或false
Boolean( 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-box
if( b ) System.out.println( "true" ) ; //auto-unbox
Character ch = 'x' ;   //auto-box
char 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中的

 

详解Java的自动装箱与拆箱(Autoboxing and unboxing)

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱 Integer total = 99;//自定拆箱 int totalprim = total;简单一点说,装箱就是...
  • hp910315
  • hp910315
  • 2015年09月22日 15:27
  • 5090

【Java】Java的==和equals()以及自动装箱拆箱

Java的==和equals()以及自动装箱拆箱Java的和equals以及自动装箱拆箱 抛一个问题 先说一说 和 equals方法equals方法 再说一下Integer的缓存机制 自动装箱和自动...
  • cflys
  • cflys
  • 2017年07月22日 11:02
  • 361

Java学习笔记之自动装箱与拆箱

更多博文可参考我的个人独立博客:贱贱的梦想 什么是自动装箱与拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Intege...
  • GongchuangSu
  • GongchuangSu
  • 2016年05月28日 22:28
  • 1182

巧记Integer int 自动装箱与拆箱

神总结:      /* 1 总结 integer  integer.valueof 一种情况可以使用 == equals  *     *      new 出来的东西只能不能喝 ...
  • qq_27040173
  • qq_27040173
  • 2016年04月26日 10:55
  • 1555

Java自动装箱和自动拆箱

Java自动装箱和拆箱
  • liamao16
  • liamao16
  • 2016年04月27日 08:59
  • 883

跟着小白浅谈"自动装箱及自动拆箱"

自动装箱及自动拆箱篇:     今天小白和大家们谈谈什么是自动装箱及自动拆箱,那么什么是自动装箱和拆箱了? 其实就是包装类(wrapper)提供的一种机制自动装箱(autoboxing)自动拆箱(u...
  • qq1723205668
  • qq1723205668
  • 2016年06月05日 13:50
  • 1117

Java---自动装箱和拆箱

自动装箱和拆箱 自动装箱和拆箱(包装和解包)1---例子演示详见代码中的Demo1 自动装箱(autoboxing):就是把基础数据类型自动封装并转换成对应的包装类的对象。 自动拆箱(unboxing...
  • qq_33621967
  • qq_33621967
  • 2016年08月03日 15:18
  • 212

java 自动装箱与拆箱

java 自动装箱与拆箱simple eg: System.out.println(123); 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记...
  • u010182913
  • u010182913
  • 2014年03月28日 19:25
  • 927

Java进阶之自动拆箱与自动装箱

自动装箱:把基本类型用它们对应的包装类包装起来,使它们具有对象的特质,可以调用所对应的包装类所定义的方法,比如toString()等。 自动拆箱:跟自动装箱的方向相反,将Integer及Double...
  • qq_31655965
  • qq_31655965
  • 2016年06月06日 18:04
  • 1706

Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 ...
  • u011726984
  • u011726984
  • 2015年08月27日 18:56
  • 7364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2SE 5.0新特性(四)自动装箱/拆箱
举报原因:
原因补充:

(最多只允许输入30个字)