自動裝箱是Java編譯器在基元類型和相應的對象包裝類之間進行的自動轉換,例如,將int
轉換爲Integer
,將double
轉換爲Double
,依此類推,若是轉換是另外一種方式,則稱爲拆箱。java
如下是自動裝箱的最簡單示例:git
Character ch = 'a';
本節中的其他示例使用泛型,若是您還不熟悉泛型的語法,請參閱泛型課程。github
考慮如下代碼:segmentfault
List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(i);
雖然你將int
值做爲基本類型而不是Integer
對象添加到li
,但代碼會進行編譯,由於li
是Integer
對象的列表,而不是int
值列表,你可能想知道爲何Java編譯器不會發出編譯時錯誤,編譯器不會生成錯誤,由於它從i
建立一個Integer
對象並將該對象添加到li
,所以,編譯器在運行時將前面的代碼轉換爲如下代碼:ui
List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(Integer.valueOf(i));
將原始值(例如int
)轉換爲相應包裝類(Integer
)的對象稱爲自動裝箱,Java編譯器應用自動裝箱,當原始值是:code
考慮如下方法:對象
public static int sumEven(List<Integer> li) { int sum = 0; for (Integer i: li) if (i % 2 == 0) sum += i; return sum; }
由於餘數(%
)和一元加號(+=
)運算符不適用於Integer
對象,你可能想知道爲何Java編譯器編譯該方法而不發出任何錯誤,編譯器不會生成錯誤是由於它在運行時調用intValue
方法將Integer
轉換爲int
:開發
public static int sumEven(List<Integer> li) { int sum = 0; for (Integer i : li) if (i.intValue() % 2 == 0) sum += i.intValue(); return sum; }
將包裝類型(Integer
)的對象轉換爲其對應的原始(int
)值稱爲拆箱,Java編譯器應用拆箱,當包裝類的對象是:get
Unboxing示例顯示了其工做原理:編譯器
import java.util.ArrayList; import java.util.List; public class Unboxing { public static void main(String[] args) { Integer i = new Integer(-8); // 1. Unboxing through method invocation int absVal = absoluteValue(i); System.out.println("absolute value of " + i + " = " + absVal); List<Double> ld = new ArrayList<>(); ld.add(3.1416); // Π is autoboxed through method invocation. // 2. Unboxing through assignment double pi = ld.get(0); System.out.println("pi = " + pi); } public static int absoluteValue(int i) { return (i < 0) ? -i : i; } }
該程序打印如下內容:
absolute value of -8 = 8 pi = 3.1416
自動裝箱和拆箱使開發人員能夠編寫更清晰的代碼,使其更易於閱讀,下表列出了原始類型及其相應的包裝類,Java編譯器使用這些類進行自動裝箱和拆箱:
原始類型 | 包裝類 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
float | Float |
int | Integer |
long | Long |
short | Short |
double | Double |