說說java的自動裝箱(autoboxing)和拆箱(unboxing

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. 這個一定得搞清楚,否則,在遇到問題的時候,可真是會讓人抓狂的 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章