[英]Why isn't the value updated?
這是一個非常基本的問題,但我似乎不明白為什么這不起作用。 據我所知, 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);
這里的關鍵字是自動裝箱
https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
基本上,java編譯器在“適當”上下文中自動在Integer
類和基本類型int
之間進行轉換。 一個這樣的背景是分配。
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引用很容易導致思維誤入歧途。
首先,在java的情況下,使用的術語是對象'reference'而不是'pointer'。 基本上它意味着它是對實際對象的邏輯引用。
正如Lagerbaer已經指出的那樣,它的自動裝箱 - 拆箱是透明的,可以有效地增加值,創建一個新對象,然后將其分配回參考。
所以在增量操作結束時,有兩個對象而不是一個。
取消裝箱后的增量操作可能如下所示:
a = Integer.valueOf(a.intValue()++);
Integer是一個不可變類型,因此您無法更改方法中的值。
a = Integer.valueOf(a.intValue() + 1);
在a++
指令之前你有:
+---------+
a --->| Integer |
b --->| 2 |
+---------+
a
和b
指向具有值2的相同Integer
對象。
使用a++
指令,Java autoboxing會自動為您執行以下步驟:
Integer
轉換為值為2的基本類型int
。 int
增加到3。 int
轉換為值為3的Integer
,這將為您提供一個新實例。 正如其他人所指出的, Integer
是一個不可變類,因此您可以為不同的值獲取不同的對象。 所以你最終得到:
+---------+ +---------+
a --->| Integer | b --->| Integer |
| 2 | | 3 |
+---------+ +---------+
你正在遞增a的值,這對a的值沒有任何影響,因為b
與a
無關。
正如肖恩已經回答的那樣,Integer(就像String一樣)是不可變的,這意味着它的價值無法改變。 所以你要調用a++
實際上創造了一個新的整數與值+ 1和存儲作為a
。 同時b仍然指着舊的整數。
這可以通過比較References( ==
運算符)來顯示。 在a++
a==b
之前返回true
(相同的引用/對象)。 后a++
a==b
返回false
,作為a
正在指向一個新的Integer對象。
為什么你認為b應該是3? 你永遠不會改變這個價值!
Integer a = new Integer(1); // a is 1
Integer b = new Integer(2); // b is 2
a = b; // a now is 2
a++; // a now is 3
System.out.print(a + " " + b);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.