自動裝箱與拆箱原始碼

2021-09-14 01:42:39 字數 1377 閱讀 2396

裝箱就是自動將基本資料型別轉換為包裝器型別;拆箱就是自動將包裝器型別轉換為基本資料型別。

總結裝箱和拆箱的實現過程:

裝箱過程是通過呼叫包裝器的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 ...