当前位置: 首页 > 面试题库 >

为什么后增量在包装器类上起作用

韦衡
2023-03-14
问题内容

我正在查看一些代码,并遇到了一个实例,该实例后增加了一个成员变量,该成员变量是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加到变量的值上,
并将总和存储回变量中
。在添加之前,对值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());


 类似资料:
  • 问题内容: 我知道包装器类是什么,它们将原始类型(例如int,double等)包装到各自类的对象中。 但是,为什么我们首先需要包装器类?为什么不简单地在我们拥有原始类型的地方使用它们呢? 问题答案: 几种可能的原因: 这样就可以有一个空值 包含在集合中 将一般/多态与其他对象一起视为对象

  • 我希望每次点击“添加到购物车”按钮时,计数在navbar中增加,但我不明白为什么我的代码不起作用,当我点击添加到购物车按钮时,当前计数器没有增加。如果有人能告诉我我错过了什么,或者给我一个更好的解决办法,我会很感激的,谢谢! null null

  • 关于如何修复gradle版本,有很多很好的建议,但有些已经过时了,或者我只是找不到建议的路径。对我来说,一个解决方案是Project>Project Structure>Project>Gradle Version。 在这里我可以把它改成支持的版本,并且成功地构建项目。 从这个链接,它暗示这是设置你的gradle包装的方式。 因此,我希望Project/Platforms/Android/Grad

  • 问题内容: 在较高的层次上,我知道我们需要通过使用它们各自的包装类在Java集合中使用它们来“包装”原始数据类型,例如int和char。我想了解Java集合如何在低级询问:“为什么我们需要将原始数据类型包装为对象才能在集合中使用它们?”在此先感谢您的帮助。 问题答案: 在虚拟机级别,这是因为与引用类型(例如java.lang.Object及其派生类型)相比,原始类型在内存中的表示方式非常不同。例如

  • 问题内容: alert(myVar1); return false; var myVar1; 上面的代码在IE,FF和Opera中引发错误,表明return语句必须包含在函数中。但它可以在Safari和Chrome中运行(显示)。 以上代码已在全局范围内编写。以外的所有功能。 任何原因? 问题答案: 在javaScript中,将变量移到脚本顶部,然后运行。所以当你运行它会做 这是因为javascr

  • 问题内容: 我想在chromedp上使用代理,但是代理似乎不起作用,尝试了chromedp.ProxyServer 使用代理后,我得到了公共IPeven。无错误/警告 问题答案: 试试这个: