前言
這個是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的區別不清楚的,可以先看點擊這裏
- //在-128~127 之外的數
- Integer num1 = 297; Integer num2 = 297;
- System.out.println("num1==num2: "+(num1==num2));
- // 在-128~127 之內的數
- Integer num3 = 97; Integer num4 = 97;
- System.out.println("num3==num4: "+(num3==num4));
//在-128~127 之外的數
Integer num1 = 297; Integer num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// 在-128~127 之內的數
Integer num3 = 97; Integer num4 = 97;
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對象時:
- String str = "sl";
- //代替下面的聲明方式
- String str = new String("sl");