裝箱就是自動將基本資料型別轉換為包裝器型別;拆箱就是自動將包裝器型別轉換為基本資料型別。
總結裝箱和拆箱的實現過程:
裝箱過程是通過呼叫包裝器的valueof方法實現的,而拆箱過程是通過呼叫包裝器的 ***value方法實現的。(***代表對應的基本資料型別)
先貼一道題
public class test
}
輸出結果是
答案和我想的完全不一樣。後來看原始碼才知道原因
這是提供的valueof方法的原始碼,
public static integer valueof(int i)
而在integercache類的實現
private static class integercache catch( numberformatexception nfe)
}high = h;
cache = new integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new integer(j++);
// range [-128, 127] must be interned (jls7 5.1.7)
assert integercache.high >= 127;
}private integercache() {}
}
由此可得出:
對於integer如果數值在[-128,127]之間,便返回指向integercache.cache中已經存在的物件的引用;否則建立乙個新的integer物件。
所以,上面的**中i1和i2的數值為100,因此會直接從cache中取已經存在的物件,所以i1和i2指向的是同乙個物件,而i3和i4則是分別指向不同的物件。
我們再來看一道題:
現在又是兩個false,我們再來看double的原始碼
public static double valueof(string s) throws numberformatexception
因此,double是建立新物件
character和boolean繼承的是object類,而其他都是繼承number類
自動裝箱與自動拆箱
jdk1.5後出現的特性,自動裝箱和自動拆箱 自動裝箱 基本資料型別,直接變成物件 自動拆箱 物件中的資料變回基本資料型別 方便使用 自動裝箱和拆箱弊端,可能出現空指標異常 public class integerdemo 2 關於自動裝箱和拆箱一些題目 public static void fun...
自動裝箱與自動拆箱
j a 中的每一種原始資料型別都有其對應的引用型別 boolean byte char double float int long 和 short 分別對應著 boolean byte character double float integer long 和 short。在處理賦值語句 方法的引數...
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...