说说java的自动装箱(autoboxing)和拆箱(unboxing

原创 2012年03月26日 07:40:22
Adversity makes a man wise, not rich. 逆境出人才

java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在javase5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。

Java代码 复制代码
  1. 在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下 
  2. 总计有八个,分别是 
  3. byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节), 
  4. long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节) 

在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行

现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒

   先说说类和对象,建立个概念吧先

Java代码 复制代码
  1. 类--可以认为是对象的设计图 
  2. 对象--是按照设计图实现了的具体工具 
  3. 先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好 

    之所以要将基本类型数据打包成为对象,原因很简单,是因为对象可以携带更多的数据

手动、自动装箱拆箱示例

    Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个“包装,加壳”,把基本数据类型放在里面,来看代码,体会下先

Java代码 复制代码
  1. public class WrapperDemo{ 
  2.     public staticvoid main(String[] args){ 
  3.          int data1=21
  4.          int data2=24
  5.          //打包成为对象 
  6.          Integer data1Wrapper = new Integer(data1); 
  7.          Integer data2Wrapper = new Integer(data2); 
  8.          //原始数据直接除以3 
  9.          System.out.println(data1/3); 
  10.          //将数据打包,转换为double型,除以3 
  11.          System.out.println(data1Wrapper.doubleValue()/3); 
  12.         //比较 
  13.         System.out.println(data1Wrapper.compareTo(data2Wrapper)); 
  14.     } 
  15.  

      图1-1是WrapperDemo的运行结果

   
  
       图1-1  WrapperDemo的运行结果

  通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了

,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的

Java代码 复制代码
  1. javase5之前,手动打包 
  2. Integer data1 = new Integer(10); 
  3. 事项将基本类型数据转换为对象 
  4. javase5之后,支持自动打包 
  5. Integer data1 = 10; 
  6. 便可以实现将基本类型的数据转换为对象 
  7. eg: 
  8.     在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较 
  9.     data1.compareTo(data2); 
  10.    基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处 

再来说说自动装箱拆箱

    自动装箱和拆箱,从本质上讲,是编译器帮了我们的忙,这就是所谓的“编译器蜜糖”,既然这么好,是不是就可以放心的用了呢?

先别着急,喝口水,咱再接着唠

    看看下面的情况,您是否了解

Java代码 复制代码
  1. Integer i = null;//表明i没有参考至任何对象 
  2. int j = i ;//相当于 int j = i.intValue() 
  3. 这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的 
Java代码 复制代码
  1. 个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦 

还是自动装箱拆箱

Java代码 复制代码
  1. public class BoxDemo{ 
  2.    public staticvoid main(String[] args){ 
  3.     Integer data1 = 500
  4.     Integer data2 = 500
  5.     System.out.println(data1==data2); 
  6.    } 

   在你看到接下来的运行结果前,您先猜猜看,运行的结果会是怎样的呢?true or false?

   图1-2是代码运行的结果

 
  
              图1-2  BoxDemo运行结果

   false?没错,它就是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,

如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false

Java代码 复制代码
  1. 在这里,区别一个概念“==”和equals() 
  2.     “==”是比较两个对象是不是引用自同一个对象 
  3.      “equals()”是比较两个对象的内容 
  4. 这个一定得搞清楚,否则,在遇到问题的时候,可真是会让人抓狂的 

C#--三行代码带你理解神秘的拆箱和装箱

一、在说拆箱和装箱之前的准备知识首先,我们需要知道c#中有两种类型:值类型和引用类型 名称 值类型 引用类型 表示类型 基本类型 类,数组,接口 ,C#特有的委托. 存储内容...
  • qq_32452623
  • qq_32452623
  • 2016年12月29日 17:22
  • 3061

【C#】装箱与拆箱

在生活中,我们都喜欢吃水果。大家都知道水果不但为我们提供丰富的膳食纤维,还有维生素及其它营养。例如:吃草莓培养耐心补充维生素,吃香蕉保持快乐心情,吃葡萄增强免疫抗衰老,吃梨帮助器官排毒等等,所有我们经...
  • lxd8731247769
  • lxd8731247769
  • 2015年10月10日 16:19
  • 624

java进阶--深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)

1.自动装箱与拆箱的定义装箱就是自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型。如下图:由上可...
  • u013309870
  • u013309870
  • 2017年04月18日 20:37
  • 368

自动装箱/拆箱(Autoboxing/unboxing)

自动装箱/拆箱方便了基本类型数据和包装类的使用。 自动装箱:基本类型自动转为包装类。(int >> Integer) 自动拆箱:包装类自动转为基本类型。(Integer >> int)...
  • zhangxiangbin001
  • zhangxiangbin001
  • 2013年07月25日 23:49
  • 261

C# 装箱和拆箱

 1、       装箱和拆箱是一个抽象的概念  2、       装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型        利用装箱和拆箱功能,可通过允许值类型的任何...
  • snakorse
  • snakorse
  • 2014年06月06日 15:51
  • 319

C#拆箱跟装箱

Net的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。那么如果要把一个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的...
  • du295611875
  • du295611875
  • 2014年11月15日 09:36
  • 170

Java的自动装箱(autoboxing)和拆箱(unboxing)

java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在javase5之后,为基本...
  • xuewater
  • xuewater
  • 2014年07月02日 14:55
  • 658

java的自动装箱(autoboxing)和拆箱(unboxing)

Adversity makes a man wise, not rich. 逆境出人才 java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在...
  • YaoYuanDeXin
  • YaoYuanDeXin
  • 2013年10月24日 15:03
  • 699

C#拆箱与装箱

【前提】 值类型 整数类型、浮点型(float double)、小数型(decimal)、布尔型(bool)、字符型(char)、结构型(struct)、枚举型(Enum) 引用类型 类:面向...
  • caoyujiao520
  • caoyujiao520
  • 2015年11月29日 20:42
  • 466

装箱和拆箱【整理】

1. 装箱和拆箱是一个抽象的概念 。 2. 装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型 ;    利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类...
  • heling0223
  • heling0223
  • 2010年01月12日 14:38
  • 268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说java的自动装箱(autoboxing)和拆箱(unboxing
举报原因:
原因补充:

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