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

转载 2012年03月27日 10:03:35

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

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

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

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

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

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

      图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.    基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处 
  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并没有参考至任何对象造成的 
  1. Integer i = null;//表明i没有参考至任何对象  
  2. int j = i ;//相当于 int j = i.intValue()  
  3. 这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的  
Java代码 复制代码
  1. 个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦 
  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.    } 
  1. public class BoxDemo{  
  2.    public static void main(String[] args){  
  3.     Integer data1 = 500;  
  4.     Integer data2 = 500;  
  5.     System.out.println(data1==data2);  
  6.    }  
  7. }  

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

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

  
   
              图1-2  BoxDemo运行结果

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

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

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

相关文章推荐

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

什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。  一般我们要创建一个类的对象实例的时候,我们会这样: ...
  • bertyj
  • bertyj
  • 2015年06月16日 16:37
  • 334

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

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱 Integer total = 99;//自定拆箱 int totalprim = total;简单一点说,装箱就是...

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

在JDK5之后,引入了自动装箱与拆箱(Autoboxing and unboxing) 创建一个Integer对象时,却可以这样:  Integer i = 100;但是和 int i = 1...

自动装箱(autoboxing)与自动拆箱(unboxing)

基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是J2SE 5.0提供的新功能。虽然为你打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在...

Java装箱与拆箱—Autoboxing and Unboxing

本文将介绍Java的自动装箱与拆箱 翻译自Java官方文档:Autoboxing and Unboxing 什么是自动装箱与拆箱? 什么时候自动装箱? 什么时候自动拆箱?...

自动装箱和自动拆箱(AutoBoxing,Unboxing)

什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。  一般我们要创建一个类的对象实例的时候,我们会这样:  Cla...

java 自动拆箱(unboxing)和自动装箱(boxing)

首先了解下Java的四类八种基本数据类型: 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean ...

Java基本数据的拆、装箱操作(unboxing&autoboxing)

1 实例 演示基本拆装箱操作的程序AutoUnbox.java

Java自动装拆箱boxing与unboxing

java的自动拆箱和装箱,boxing与unboxing
  • zlp1992
  • zlp1992
  • 2016年04月18日 20:12
  • 781

C#装箱和拆箱(Boxing 和 UnBoxing)

1、什么是装箱和拆箱? 简单来说:       装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。(网上广为流传)  C#中值类型和引用类型的最终基类都是Object类型(它本身是一个引用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说java的自动装箱(autoboxing)和拆箱(unboxing
举报原因:
原因补充:

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