Ada*_*eld 45
您可以使用该javap
工具自己查看.编译以下代码:
public class AutoboxingTest
{
public static void main(String []args)
{
Integer a = 3;
int b = a;
}
}
Run Code Online (Sandbox Code Playgroud)
编译和反汇编:
javac AutoboxingTest.java
javap -c AutoboxingTest
Run Code Online (Sandbox Code Playgroud)
输出是:
Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: aload_1
6: invokevirtual #3; //Method java/lang/Integer.intValue:()I
9: istore_2
10: return
}
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,autoboxing调用静态方法Integer.valueOf()
,并且autounboxing调用intValue()
给定Integer
对象.没有别的,真的 - 这只是语法糖.
我想出了一个单元测试,证明调用了Integer.valueOf()而不是包装器的构造函数.
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import org.junit.Test;
public class Boxing {
@Test
public void boxing() {
assertSame(5, 5);
assertNotSame(1000, 1000);
}
}
Run Code Online (Sandbox Code Playgroud)