【发布时间】:2012-10-28 02:58:11
【问题描述】:
我正在审查一些代码,并遇到了一个实例,有人在递增一个成员变量,该成员变量是整数的包装类。我自己尝试过,真的很惊讶它的效果。
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;
【问题讨论】:
-
它与其说是 Integer 的包装类,不如说是 x 是 Integer 类的一个实例,以及随之而来的方法/运算符。其中之一是“++”运算符,它增加了它的值。
-
@hd1 - 这是不正确的。
++运算符仅适用于(原始)整数类型。在幕后,x被取消装箱,++被应用,然后将结果分配回x(在装箱转换之后)。Integer类没有++运算符。事实上,Integer对象是不可变的。 -
为什么你会期望输出是
0, 0? -
@hd1:Java 不支持运算符重载,除非在一种非常特殊的情况下(字符串中的 + 运算符)。 Integer 类没有 ++ 运算符。
-
@Ted - 熟悉 C++ 的人可能还期望 Integer 的行为方式与 C++ 'const' 对象的行为方式相同。我不认为它特别直观,特别是因为预增量通常不涉及临时变量。在docs.oracle.com/javase/tutorial/java/data/numbers.html 或docs.oracle.com/javase/tutorial/java/data/autoboxing.html 的任何地方似乎都没有涵盖它
标签: java immutability post-increment