谈谈Java的自动装箱和拆箱

上一篇 / 下一篇  2012-04-01 09:48:43 / 个人分类:Java

KKp VIo8G0  Java作为面向对象语言,有人认为所看到的都是对象,事实上,在Java SE 5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在Java SE 5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。51Testing软件测试网!y@ TuOZB+p3P

51Testing软件测试网,rN9`} MB

51Testing软件测试网 sD-m-rg

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

%yvi D;F0

S$apR9H*]051Testing软件测试网-L?ud6v)c f

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

9|%LdmQ-l-P&V0

7c`'F0K*D?+b"x0  现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒。51Testing软件测试网T Sa0z!P1f/TM'a

"jQh$[#LL-^+M0  先说说类和对象,建立个概念吧先

/A(l%Lz7O z*d+zg0

)J(i0p7a(sF f0

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

9RiJxuk8^/~0

1[8w'w/]"p"}0O.a{$I0

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

,Ab Fst9z1n051Testing软件测试网Q0WK.U?m

  手动、自动装箱拆箱示例

%[d#ib/HyTW.Lh5V051Testing软件测试网t{#JN$YTZHU

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

.{4P1SvmR*x051Testing软件测试网3h%r;kF xK3e:Q

T{(B8k `'s0
  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.    
  16. }
51Testing软件测试网6D%y*Sbs+c3e4y

;{#S]H,F!GW0

4hnz:W'Qmr V0

图1-1 WrapperDemo的运行结果51Testing软件测试网/[2m){0r#T J]!D-b

  通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的。

-Z8J\W7?3n0

51Testing软件测试网;H_+Z(f/G'\v5lq*LJq

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

(`2U5}?m$v1kG r0  自动装箱和拆箱,从本质上讲,是编译器帮了我们的忙,这就是所谓的“编译器蜜糖”,既然这么好,是不是就可以放心的用了呢?51Testing软件测试网M#~7@*b_ @

F0e]l)D7[{0  先别着急,喝口水,咱再接着唠51Testing软件测试网v6p }$O#Q6i^

51Testing软件测试网Z/t0c~6u&vE H

  看看下面的情况,您是否了解51Testing软件测试网@'?XK6dn y&`YK!T

51Testing软件测试网+`x:FT1~/g6ea

51Testing软件测试网n }T.|TYH7jsbO

  1. Integer i = null;//表明i没有参考至任何对象 
  2. int j = i ;//相当于 int j = i.intValue() 
  3. 这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的

+[b7d5G`)q V.MM]051Testing软件测试网fp&B*tG

51Testing软件测试网6Yugil3jQ u7q

J0b0\5@BNX0
个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦

c;a[3ca1eM([0

i1yLP5B ub ~ y0

D5q*fG#fN x)~0  还是自动装箱拆箱51Testing软件测试网Twp_5WqM2}'{v.e

A_!h pHJ\}*v$m051Testing软件测试网#|/t Mzc K5`'XvP

  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. }

b*q2t:dT)?A&}051Testing软件测试网,p L2i#?J5y?1l

51Testing软件测试网EN__A J

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

} TiLp0

51Testing软件测试网 K|rWK)}

图1-2 BoxDemo运行结果

]2n]&?Q#v0

  false?没错,它就是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用。51Testing软件测试网EIj/zw%m5GLj

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

okH~)}0

51Testing软件测试网Kp2P6NT6L8Kz

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

)g*p$W&?xr0J#M051Testing软件测试网)_ogoD9@F


TAG:

 

评分:0

我来说两句

Open Toolbar