为什么值不更新?

时间:2017-01-19 20:08:10

标签: java

这是一个非常基本的问题,但我似乎不明白为什么这不起作用。据我所知,ab将成为Integer对象的指针(在C思考中)。为什么输出3 2而不是3 3?我希望在递增a时,b的值也会增加。

Integer a = new Integer(1);
Integer b = new Integer(2);
a = b;
a++;
System.out.print(a + " " + b);

8 个答案:

答案 0 :(得分:4)

此处的关键字是自动装箱

https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

基本上,java编译器会自动在Object类和"适当的"中的基元类型Integer之间进行转换。上下文。其中一个上下文就是赋值。

答案 1 :(得分:4)

Integer是不可变的,a++a = a + 1一样,设置a以引用不同的不可变对象。

换句话说:a = b设置a以引用与b相同的对象,但在a++ab之后再次参考不同的对象。

等同于我怀疑你想到的C代码;

int *a = malloc(sizeof(*a));
*a = 1;
int *b = malloc(sizeof(*b));
*b = 2;
a = b;
(*a)++;

从C指针或C ++引用的角度思考Java引用很容易导致思维误入歧途。

答案 2 :(得分:4)

首先,在java的情况下,使用的术语是对象'reference'而不是'pointer'。基本上它意味着它是对实际对象的逻辑引用。

正如Lagerbaer已经指出的那样,它的autoboxing-unboxing是透明的,它有效地增加了值,创建了一个新对象,然后将它分配回引用。

因此,在增量操作结束时,有两个对象而不是一个。

取消装箱后的增量操作可能如下所示:

a = Integer.valueOf(a.intValue()++);

答案 3 :(得分:2)

Integer是一种不可变类型,因此您无法更改方法中的值。

a = Integer.valueOf(a.intValue() + 1);

答案 4 :(得分:2)

+---------+ a --->| Integer | b --->| 2 | +---------+ 指示之前:

a

bInteger都指向同一个值为a++的{​​{1}}对象。

使用Integer指令,Java merge会自动为您执行以下步骤:

  1. 将值{2的int转换为值为2的基本类型int
  2. 将原始值int增加到3。
  3. 将值为3的基本类型Integer转换为值为3的Integer,这将为您提供一个新实例。正如其他人指出的那样, +---------+ +---------+ a --->| Integer | b --->| Integer | | 2 | | 3 | +---------+ +---------+ 是一个autoboxing类,因此您可以获得不同值的不同对象。
  4. 所以你最终得到:

    Node

答案 5 :(得分:1)

您正在增加a的值,因为intb无关,因此对值不会产生任何影响。

答案 6 :(得分:1)

正如Sean已经回答的那样,Integer(就像String一样)是不可变的,这意味着它的价值无法改变。因此,您对file_put_contents的调用实际上创建了一个值为a + 1的新Integer,并将其存储为a++。与此同时,b仍然指着旧的整数。

这可以通过比较References(a运算符)来显示。在== a++返回a==b之前(相同的参考/对象)。在true a++返回a==b后,false现在指向一个新的整数对象。

答案 7 :(得分:0)

为什么你认为b应该是3?你永远不会改变这个价值!

a