基本資料型別的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。
一般我們要建立一個類的物件的時候,我們會這樣:
Class a = new Class(parameter);
裝箱:
當我們建立一個Integer物件時,卻可以這樣:
Integer i = 100; (注意:不是 int i = 100; )
Integer i = 100實際上是 Integer i = Integer.valueOf(100);此即基本資料型別的自動裝箱功能。
PS:當 Integer i = XX XX不在valueOf的範圍(-128~127)內時,Integer i = XX歸根結底就是Integer i = new Integer(XX)
拆箱:
Integer i = new Integer(333);
int j = i;//自動取出其值
InvalueOf原始碼如下:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
當方法的引數小於等於127和大約等於-128時,會始終只在記憶體中存在一個相同數值的物件,
Integer i = 100;
Integer j = 100;
i和j指會向同一個物件。
不明白的可以再去看看Integer中的私有類IntegerCache,第一次初始化的時候它就會造出來256個物件。
裝箱和拆箱的例子,從基本型別對應的類到Object的轉換,也是裝箱和拆箱的一個用法:
class fu{
int i=1111;
}
class zi extends fu{
int j =2222;
}
public class Test {
/**
* @param args
*/
public static void main(String args[]) {
Integer a=new Integer(333);
m31(a);
zhuangxiangTest(new zi());
Integer c = new Integer(128);
Object s = c;
Integer x = (Integer) s;//這一句是為了試一下Integer x = s;會不會“拆箱”,結果證明同其它的父子繼承一樣,不轉換型別會報錯
System.out.println(s);
}
public static void m31(Object i) {
System.out.println(i.getClass());//這裡不需要轉換,自動就轉換了
}
public static void zhuangxiangTest(fu x) {
zi i = (zi)x;//多一步轉換否則下面這句是行不通的
System.out.println(i.j);
}
}
另外:
String str = "a"也是裝箱,應該相當於String str = "a".intern();
intern是一個本地方法,它會去記憶體中檢查是否有這個常量。