看一下这段代码
Integer x = 5;
Integer y = 2;
Integer xy = x+y;
System.out.println("xy = " + xy); // outputs: 7
System.out.println("xy2 = " + xy2); // outputs: 7
x++;
System.out.println("xy = " + xy); // outputs: 7
System.out.println("xy2 = " + xy2); // outputs: 7
如何在不使用为您计算代码的方法的情况下输出代码8?
答案 0 :(得分:5)
Java中的Integer
是不可变的。你不能改变它的价值。此外,它是一种特殊的自动装箱类型,可为int
原语提供Object包装器。
例如,在您的代码中,x++
不会修改引用的Integer
对象x
。它会将其解压缩到原始int
,然后对其进行递增,重新自动将其返回新的Integer
对象并将Integer
分配给x
。
编辑以添加完整性: Autoboxing是Java中可能导致混淆的特殊事物之一。在谈论内存/对象时,幕后还有更多内容。 Integer
类型还在自动装箱时实现flyweight模式。缓存从-128到127的值。在比较.equals()
个对象时,总是使用Integer
方法。
Integer x = 5;
Integer y = 5;
if (x == y) // == compares the *reference (pointer) value* not the contained int value
{
System.out.println("They point to the same object");
}
x = 500;
y = 500;
if (x != y)
{
System.out.println("They don't point to the same object");
if (x.equals(y)) // Compares the contained int value
{
System.out.println("But they have the same value!");
}
}
请参阅:Why aren't Integers cached in Java?了解更多信息(当然还有JLS)
答案 1 :(得分:3)
修改xy
后,您需要更新x
。所以:
x++;
xy = x + y;
xy2 = x + y;
在Java中,如果您希望更改值,则需要自己更新变量。它与其他表达两个变量之间关系的语言不同,只要变量发生变化,就会保持这种关系。
答案 2 :(得分:1)
表达式: xy = x + y 并不意味着现在xy取决于x和y的值(如果它们改变了,xy也改变了)。您可以看到如下:表达式x + y的值插入到xy中。
因此,在设置xy的值之前,必须增加x的值(x ++)。
答案 3 :(得分:-1)
我是java新手,我不太确定这个问题的上下文,但是如果你想做的只是输出8,你可以把它变成xy ++而不是x ++。
Integer x = 5;
Integer y = 2;
Integer xy = x+y;
int xy2 = x+y; // just testing to see if it makes a difference
System.out.println("xy = " + xy); // outputs: 7
System.out.println("xy2 = " + xy2); // outputs: 7
**xy++;**
System.out.println("xy = " + xy); // **outputs: 8**
System.out.println("xy2 = " + xy2); // outputs: 7