程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2SE >> 體驗J2SE 1.5新特性之裝箱和拆箱(3)

體驗J2SE 1.5新特性之裝箱和拆箱(3)

編輯:J2SE

3. 發生Autoboxing的具體時機

發生Autoboxing的具體時機,主要有這麼三種:

把基本類型的數據賦給引用類型的變量時。例如把一個int型的數據賦給一個Integer型變量。

清單7:賦給引用類型的變量基本類型的數據

Integer i = 31415;

把基本類型的數據傳給引用類型的參數時。例如給一個定義成Object的參數傳遞一個boolean型的數據。

清單8:傳給引用類型的參數基本類型的數據

HashMap map = new HashMap();
map.put(true, null);

把基本類型的數據往引用類型上強制轉化時。例如在一個long型的數據前面加上(Long)。

清單9:從基本類型的數據到引用類型上強制轉化

System.out.println((Long) 27828L);

4. Autoboxing的局限

Autoboxing的機制有一個局限——只能把基本類型的數據往它們自己的包裹類(以及包裹類的上級類)上轉化。

類似這樣的代碼是不能工作的,盡管int型的數據完全可以用一個Long對象來表示:

清單10:不能同時進行自動向上轉型和Autoboxing

int i = 27828;
System.out.println((Long) i);/* 編譯時出錯 */

這是因為這段代碼實際上相當於:

清單11:Autoboxing操作會在自動向上轉型之前發生

int i = 27828;
System.out.println((Long) Integer.valueOf(i));/* 編譯時出錯 */

而Integer並不是Long的子類,所以這個轉化無法進行。如果一定要進行這種操作,需要手工追加一次轉型:

清單12:需要先強制向上轉型,再作Boxing

int i = 27828;
System.out.println((Long)(long) i);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved