说说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. 这个一定得搞清楚,否则,在遇到问题的时候,可真是会让人抓狂的 

1.自动装箱和拆箱

/**  * 基本类型的数据值可以直接赋给基本数据对象,基本数据的对象也可以直接赋给基本数据变量  * 在表达式中,基本类型的数据值可以和基本数据对象进行运算  * 基本数据类型的数组不能实现自...
  • Magister_Feng
  • Magister_Feng
  • 2012年06月14日 10:18
  • 644

Java---自动装箱和拆箱

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

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

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

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

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

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

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

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

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

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

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

自动装箱和拆箱的使用(autoboxing/unboxing)

JDK1.5后引入autoboxing和unboxing 目的:在赋值和运算中基本类型和其对应的包装类互相转换应用: Integer i = 10; 注意 享元...
  • lidf2007
  • lidf2007
  • 2013年04月07日 13:52
  • 308

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

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

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

Java的==和equals()以及自动装箱拆箱Java的和equals以及自动装箱拆箱 抛一个问题 先说一说 和 equals方法equals方法 再说一下Integer的缓存机制 自动装箱和自动...
  • cflys
  • cflys
  • 2017年07月22日 11:02
  • 348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说java的自动装箱(autoboxing)和拆箱(unboxing
举报原因:
原因补充:

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