它是編譯器還是運行時執行自動裝箱/拆箱?誰來做自動裝箱/拆箱?
考慮下面的例子:
public Integer get() {
return 1; //(1)
}
在(1),原始整數值將被轉換成類似new Integer(1)
,並返回。這實際上是一種稱爲自動裝箱的暗示裝置,但誰會這樣做呢?編譯器還是JVM?
我剛剛開始學習ASM,而這樣的拳擊問題讓我很困惑。
它是編譯器還是運行時執行自動裝箱/拆箱?誰來做自動裝箱/拆箱?
考慮下面的例子:
public Integer get() {
return 1; //(1)
}
在(1),原始整數值將被轉換成類似new Integer(1)
,並返回。這實際上是一種稱爲自動裝箱的暗示裝置,但誰會這樣做呢?編譯器還是JVM?
我剛剛開始學習ASM,而這樣的拳擊問題讓我很困惑。
可以使用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);
}
結論:
編譯器爲你做。
謝謝,現在我必須添加其他幾行代碼... – glee8e
自動裝箱是自動轉換,Java 編譯器在原始類型與其對應的對象包裝類之間進行自動轉換。
考慮到這一點: int a = myScan.nextInt(); 整數b = a; 編譯器將如何執行此操作,但無法知道將具有什麼值? – Stultuske
@Stultuske編譯器會將整數b = Integer.valueOf(a);'。簡單。它不需要知道'a'的價值。另請參閱此問題的接受答案。 –