这是一个非常基本的问题,但我似乎不明白为什么这不起作用。据我所知,a
和b
将成为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);
答案 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++
,a
和b
之后再次参考不同的对象。
等同于我怀疑你想到的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
b
和Integer
都指向同一个值为a++
的{{1}}对象。
使用Integer
指令,Java merge
会自动为您执行以下步骤:
int
转换为值为2的基本类型int
。int
增加到3。Integer
转换为值为3的Integer
,这将为您提供一个新实例。正如其他人指出的那样, +---------+ +---------+
a --->| Integer | b --->| Integer |
| 2 | | 3 |
+---------+ +---------+
是一个autoboxing类,因此您可以获得不同值的不同对象。所以你最终得到:
Node
答案 5 :(得分:1)
您正在增加a的值,因为int
与b
无关,因此对值不会产生任何影响。
答案 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