有人可以解释一下我们在java中添加两个Integer对象时的内部行为吗? (就像它是unbox Object into primitives然后添加两个整数然后将它装入Integer对象)
Integer sum = new Integer(2) + new Integer(4);
答案 0 :(得分:18)
编译成:
Integer sum = Integer.valueOf(new Integer(2).intValue()+new Integer(4).intValue());
您可以通过查看使用javap -c
获得的字节代码反汇编来验证这一点。
这是与新的Integer(2).intValue()对应的部分,在堆栈上留下int 2:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: invokevirtual #4; //Method java/lang/Integer.intValue:()I
这是与新的Integer(4).intValue()对应的部分,将int 4留在堆栈上:
11: new #2; //class java/lang/Integer
14: dup
15: iconst_4
16: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
19: invokevirtual #4; //Method java/lang/Integer.intValue:()I
这里总和2 + 4用iadd
计算,通过调用Integer.valueOf
将总和装入一个整数,结果存储在第一个局部变量中{{1 }}):
astore_1
答案 1 :(得分:0)
创建两个Integer
个实例。
自动取消装箱这两个实例。
保存结果的新int
。
将结果自动装箱到Integer sum
实例。