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)