Java™ 教程(自動裝箱和拆箱)

自動裝箱和拆箱

自動裝箱是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,但代碼會進行編譯,由於liInteger對象的列表,而不是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

上一篇:StringBuilder類

下一篇:爲何要使用泛型?

相關文章
相關標籤/搜索