为什么后期增量适用于包装类

Jhe*_*ico 12 java immutability post-increment

我正在对一些代码进行审查,并且遇到了一个有人在增加一个成员变量的实例,该成员变量是一个围绕Integer的包装类.我亲自尝试过,真的很惊讶它有效.

Integer x = 0; 
System.out.print(x++ + ", ");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)

这打印出来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());
Run Code Online (Sandbox Code Playgroud)

但显然规范中有些东西会在x = temp1;最后一行之前添加

Ted*_*opp 15

跨平台使用是完全安全的.该行为在Java语言规范的第15.4.2节中指定(重点已添加):

后缀表达式的结果必须是可转换(§5.1.8)到数字类型的类型的变量,否则会发生编译时错误.

后缀增量表达式的类型是变量的类型.后缀增量表达式的结果不是变量,而是值.

在运行时,如果操作数表达式的评估突然完成,则后缀增量表达式突然完成,原因相同并且不会发生增量.否则,将值1添加到变量的值中,并将总和存储回变量中.在添加之前,对值1和变量的值执行二进制数字提升(第5.6.2节).如果必要,在存储之前,通过缩小的基元转换(第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());
Run Code Online (Sandbox Code Playgroud)

  • 只想添加整数是不可变的,所以在此之后,x实际上是一个不同的对象. (2认同)