1. 程式人生 > >JAVA——包裝類的自動裝箱和拆箱

JAVA——包裝類的自動裝箱和拆箱

關於JAVA的包裝類自動拆箱和裝箱,有很多人做過介紹,但筆者發現說的不夠簡潔,而這個問題在面試、筆試中又經常涉及,故筆者將蒐集到的資訊與大家分享下:

包裝類(原始型別對應的類,即Boolean, Byte, Short, Integer, Long, Float, Double, Character)的自動拆、裝箱分別是指如下的過程:

裝箱:是指基本型別變為相應包裝類的過程,如Integer a=Integer.valueOf(100);或者int a=100;Integer b=new Integer(a);這裡的Integer.valueOf(100)和new Integer(a)就是裝箱,由基本資料型別構造出一個包裝類的物件。

拆箱:就是裝箱的逆過程。如Integer a=new Integer(100);int b=a.intValue();這裡的a.intValue()就是拆箱的過程,由一個包裝類物件轉換到相應的基本資料型別。

自動裝箱、拆箱:指編譯器幫助開發人員完成包裝類的裝箱和拆箱過程,也就是在將*.java檔案編譯成*.class檔案的過程中完成。本文的目的是要介紹一下,編譯器在何時才進行自動裝箱、拆箱

包裝類的自動裝箱和拆箱規則如下:

  • 遇到賦值運算子“=”(包括傳引數,引數傳遞屬於隱式賦值)時,會將包裝類拆箱裝箱為相應型別
  • 遇到算術運算子、位運算子和位移運算子“+, ++, --, -, *, /, %, &, |, ^, ~, <<, >>, >>>”時,對包裝類進行
    拆箱
  • 遇到關係運算符">, <, >=, <="(不包括“==”和“!=”哦)時,對包裝類進行拆箱
  • 對關係運算符"==, !="而言,遇到數字常量算術表示式時,才對包裝類進行拆箱
其餘情況下,不進行自動的裝箱和拆箱,注意啊,這裡說的是自動裝箱和拆箱。 對照上述的規則,來看幾個例子吧。這裡分別給出*.java檔案裡的程式碼和*.class檔案裡的程式碼,後者是編譯器進行自動裝箱和拆箱後的結果,讀者可以對比兩張圖片的內容來加深理解。這裡就不再累述了。   圖1 *.java檔案裡的內容   
 圖2  *.class檔案裡的內容 值得一提的是,包裝類的equals方法不支援資料型別的自動轉換
。例如Integer類的equals方法是這樣的:

本文采用的實驗環境是jdk1.7.0_21。如有錯誤,還請指正,非常感謝。得意