执行以下代码时,第3行内部发生了什么
Integer i=1;
Double d1=1.1;
Double d2= i+d1;
答案 0 :(得分:10)
您可以在语言规范中阅读“内部”工作的定义:
但这些可能有点干。
尝试反编译以下代码:
void add(Integer i, Double d1) {
Double d2= i+d1;
}
编译为:
void add(java.lang.Integer, java.lang.Double);
Code:
0: aload_1
1: invokevirtual #6 // Method java/lang/Integer.intValue:()I
4: i2d
5: aload_2
6: invokevirtual #7 // Method java/lang/Double.doubleValue:()D
9: dadd
10: invokestatic #5 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
13: astore_3
14: return
逐行分解(对于重要的行,无论如何):
i
到Integer
int
int
的{{1}}值扩大为i
double
到d1
Double
double
的结果装箱到double
。您可以将其视为等同于:
Double
因为两者具有相同的字节码。
答案 1 :(得分:2)
在Java中的每个算术运算中,结果至少为int。如果任何操作数大于int,则结果与较大操作数的类型相同。在第三行,我被取消装箱并提升为双倍,并添加到未装箱的d1值。然后将结果装入d2。
答案 2 :(得分:1)
java如何允许添加Integer和Double实例?
包装器对象(整数,双精度,浮点数等)不能是+
或-
等算术运算符的直接目标。
只有原语可能是这些运算符的目标。
但是从java 5开始,Java允许自动将Integer
转换为int
并使用自动装箱进行反向。
所以这里:
Integer i=1;
Double d1=1.1;
Double d2= i+d1;
第三行可分为两个步骤:
i+d1
,Double d1
和Integer i
转换为对应的原语(拆箱操作)。这允许进行添加(1 + 1.1
)以产生double
原始值。
此处Double d2=i+d1;
此double
原语的结果将转换为Double
对象(装箱)。