談談Java的自動裝箱和拆箱
Java作為面向對象語言,有人認為所看到的都是對象,事實上,在Java SE 5之前,基本類型默認并不是采用對象存在的如果您想要把基本類型作為對象來處理,就必須自行轉換,不過,在Java SE 5之后,為基本數據類型提供了自動裝箱和拆箱功能,使得將基本類型轉換為對象變得極其便捷。
- 在這里來捋一捋java的基本數據類型,不理不要緊,一理才發(fā)現俺也掌握的不是那么明確,在這里俺也再次學習下
- 總計有八個,分別是
- byte字節(jié)型(一個字節(jié)),char字符型(兩個字節(jié)),short短整型(兩個字節(jié)),int整型(四個字節(jié)),
- long長整型(八個字節(jié)),float浮點型(四個字節(jié)),double 雙精度浮點型(八個字節(jié)),boolean型(一個字節(jié))
在javase5之前,如果想要把基本數據類型作為對象來操作,就需要采用對應的對象,來把它們打包才行
現在雖然不用這樣了,但其中也有一些要注意的地方,俺揪出來曬曬。
先說說類和對象,建立個概念吧先
- 類--可以認為是對象的設計圖
- 對象--是按照設計圖實現了的具體工具
- 先這么簡單理解吧,如果真要扯開了說,那可是軟件工程里面的一門專業(yè)課,我們有個概念就好
之所以要將基本類型數據打包成為對象,原因很簡單,是因為對象可以攜帶更多的數據。
手動、自動裝箱拆箱示例
Long,Integer,Double,Float,Boolean等等的類就是所謂的wrapper類,就跟wrapper這個單詞所代表的意思一樣,就是提供一個“包裝,加殼”,把基本數據類型放在里面,來看代碼,體會下先
- public class WrapperDemo{
- public staticvoid main(String[] args){
- int data1=21;
- int data2=24;
- //打包成為對象
- Integer data1Wrapper = new Integer(data1);
- Integer data2Wrapper = new Integer(data2);
- //原始數據直接除以3
- System.out.println(data1/3);
- //將數據打包,轉換為double型,除以3
- System.out.println(data1Wrapper.doubleValue()/3);
- //比較
- System.out.println(data1Wrapper.compareTo(data2Wrapper));
- }
- }
圖1-1 WrapperDemo的運行結果
通過上面的代碼和運行結果,看到了將基本數據類型打包成為對象帶來的好處了吧,別著急,這還只是javase5之前的做法,在javase5之后就已經支持自動裝箱和拆箱了,在這,就不再單獨寫代碼出來了,只寫幾個能說明問題的語句就可以了,相信很容易理解的。
- javase5之前,手動打包
- Integer data1 = new Integer(10);
- 事項將基本類型數據轉換為對象
- javase5之后,支持自動打包
- Integer data1 = 10;
- 便可以實現將基本類型的數據轉換為對象
- eg:
- 在上面的代碼中,可以采用,可以直接進行兩個基本數據類型的比較
- data1.compareTo(data2);
- 基本數據類型本身沒有什么方法,當你運行之后會發(fā)現,它仍然可以正確運行,這就自動裝箱和拆箱帶來的好處
再來說說自動裝箱拆箱
自動裝箱和拆箱,從本質上講,是編譯器幫了我們的忙,這就是所謂的“編譯器蜜糖”,既然這么好,是不是就可以放心的用了呢?
先別著急,喝口水,咱再接著嘮
看看下面的情況,您是否了解
- Integer i = null;//表明i沒有參考至任何對象
- int j = i ;//相當于 int j = i.intValue()
- 這樣的代碼,編譯時是可以通過的,因為它的語法是正確的,但在運行時,就會排除NullPointerException錯誤,這是由于i并沒有參考至任何對象造成的
- 個人建議,如果您對裝箱拆箱不是理解的很清楚,***還是按部就班的一步一步的對它進行裝包和拆包,這樣,有的時候,可能會為你節(jié)省很多糾錯的時間哦
還是自動裝箱拆箱
- public class BoxDemo{
- public static void main(String[] args){
- Integer data1 = 500;
- Integer data2 = 500;
- System.out.println(data1==data2);
- }
- }
在你看到接下來的運行結果前,您先猜猜看,運行的結果會是怎樣的呢?true or false?
圖1-2 BoxDemo運行結果
false?沒錯,它就是false,自動裝箱時,對于值從-128-127之間的數,被裝箱后,會被放在內存中進行重用,
如果超出了這個值的范圍就不會被重用的,所以每次new出來的都是一個新的對象,結果自然會是false。
- 在這里,區(qū)別一個概念“==”和equals()
- “==”是比較兩個對象是不是引用自同一個對象。
- “equals()”是比較兩個對象的內容。
- 這個一定得搞清楚,否則,在遇到問題的時候,可真是會讓人抓狂的。
原文鏈接:http://blog.csdn.net/mlc0202/article/details/7393471
【編輯推薦】