我正在对一些代码进行审查,并遇到了一个有人在增加一个成员变量的实例,该成员变量是一个围绕Integer的包装类。我亲自尝试过,真的很惊讶它有效。
Integer x = 0;
System.out.print(x++ + ", ");
System.out.print(x);
打印出来 0, 1
不是 0, 0
正如我所料。我查看了语言规范,找不到任何有关此内容的内容。任何人都可以向我解释为什么这有效,如果它在多个平台上是安全的?我原本以为这会分解成
Integer x = 0;
int temp1 = x.intValue();
int temp2 = temp1 + 1;
System.out.println(temp1);
temp1 = temp2;
System.out.println(x.intValue());
但显然规范中有一些东西可以补充它 x = temp1;
在最后一行之前
跨平台使用是完全安全的。行为在。中指定 Java语言规范的第15.4.2节 (重点补充):
后缀表达式的结果必须是可转换类型的变量(§5.1.8)数字类型,或发生编译时错误。
后缀增量表达式的类型是变量的类型。后缀增量表达式的结果不是变量,而是值。
在运行时,如果操作数表达式的评估突然完成,则后缀增量表达式出于同样的原因突然完成,并且不会发生增量。否则,将值1添加到变量的值 并将总和存回到变量中。在添加之前,二进制数字促销(§5.6.2)对值1和变量值执行。如有必要,通过缩小原始转换来缩小总和(§5.1.3)和/或进行拳击转换(§5.1.7)在存储变量之前的变量类型。后缀增量表达式的值是存储新值之前的变量值。
编辑 这里更准确地等同于您的示例代码中发生的事情:
Integer x = 0;
int temp = x.intValue();
x = temp + 1; // autoboxing!
System.out.println(temp + ", ");
System.out.println(x.intValue());
从Java 1.5开始,Java执行自动拆箱以转换“包装类型”,例如 Integer
到相应的原始类型 int
必要时。然后增量运算符可以处理结果 int
。
它是Java 5中的一个“新”特性 自动装箱 - 在需要时将整数转换为 - 反之亦然。同样适用于Float,Double,Boolean等。
虽然这是一个方便的功能,但如果您不小心,它可能会导致巨大的性能损失