2016-01-28 89 views
7

它是編譯器還是運行時執行自動裝箱/拆箱?誰來做自動裝箱/拆箱?

考慮下面的例子:

public Integer get() { 
    return 1; //(1) 
} 

在(1),原始整數值將被轉換成類似new Integer(1),並返回。這實際上是一種稱爲自動裝箱的暗示裝置,但誰會這樣做呢?編譯器還是JVM?

我剛剛開始學習ASM,而這樣的拳擊問題讓我很困惑。

+0

考慮到這一點: int a = myScan.nextInt(); 整數b = a; 編譯器將如何執行此操作,但無法知道將具有什麼值? – Stultuske

+0

@Stultuske編譯器會將整數b = Integer.valueOf(a);'。簡單。它不需要知道'a'的價值。另請參閱此問題的接受答案。 –

回答

11

可以使用javap -c命令看到的反彙編代碼:

public class Example { 
    public Example(); 
    Code: 
     0: aload_0 
     1: invokespecial #1 // Method java/lang/Object."<init>":()V 
     4: return 

    public java.lang.Integer get(); 
    Code: 
     0: iconst_1 
     1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     4: areturn 
} 

你可以看到Integer#valueOf被調用,所以實際的代碼將被翻譯成:

public Integer get(){ 
    return Integer.valueOf(1); 
} 

結論:

編譯器爲你做。

+0

謝謝,現在我必須添加其他幾行代碼... – glee8e

1

自動裝箱是自動轉換,Java 編譯器在原始類型與其對應的對象包裝類之間進行自動轉換。