1. 程式人生 > >Java進階(三十七)java 自動裝箱與拆箱

Java進階(三十七)java 自動裝箱與拆箱

  這個是jdk1.5以後才引入的新的內容。Java語言規範中說道:在許多情況下包裝與解包裝是由編譯器自行完成的(在這種情況下包裝稱為裝箱,解包裝稱為拆箱);

     其實按照我自己的理解自動裝箱就可以簡單的理解為將基本資料型別封裝為物件型別,來符合Java的面向物件;例如用int來舉例:

     //宣告一個Integer物件

     Integer num = 10;

     //以上的宣告就是用到了自動裝箱:解析為

     Integer num = new Integer(10);

     以上就是一個很好的體現,因為10是屬於基本資料型別的,原則上它是不能直接賦值給一個物件Integer的,但jdk1.5後你就可以進行這樣的宣告,這就是自動裝箱的魅力。

     自動將基本資料型別轉化為對應的封裝型別。成為一個物件以後就可以呼叫物件所宣告的所有的方法。

     自動拆箱:故名思議就是將物件重新轉化為基本資料型別:

     //裝箱

     Integer num = 10;

     //拆箱

     int num1 = num;

     自動拆箱有個很典型的用法就是在進行運算的時候:因為物件是不能直接進行運算的,而是要轉化為基本資料型別後才能進行加減乘除。

     Integer num = 10;

     //進行計算時隱含的有自動拆箱

     System.out.print(num--);

     看下面一個例子,在看下面一個例子時如果對於 == 與 equal的區別不清楚的,可以先看

點選這裡

  1. //在-128~127 之外的數  
  2. Integer num1 = 297;   Integer num2 = 297;             
  3. System.out.println("num1==num2: "+(num1==num2));                      
  4. // 在-128~127 之內的數  
  5. Integer num3 = 97;   Integer num4 = 97;     
  6. System.out.println("num3==num4: "+(num3==num4));  

     列印的結果是:num1==num2: false    num3==num4: true

     很奇怪吧:這就歸結於java對於Integer與int的自動裝箱與拆箱的設計,是一種模式:享元模式(flyweight)

     為了加大對簡單數字的重利用,java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體中被重用,始終只存在一個物件。

    而如果超過了從–128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次裝箱時都新建一個 Integer物件;明白了吧。

     以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行例項化,就會每次new就都一個新的物件;

     這樣的自動裝箱拆箱不僅在基本資料型別中有應用,在String類中也有應用,比如我們經常宣告一個String物件時:

  1. String str = "sl";  
  2. //代替下面的宣告方式  
  3. String str = new String("sl");  

美文美圖