簡體   English   中英

為什么值不更新?

[英]Why isn't the value updated?

這是一個非常基本的問題,但我似乎不明白為什么這不起作用。 據我所知, 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);

這里的關鍵字是自動裝箱

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

基本上,java編譯器在“適當”上下文中自動在Integer類和基本類型int之間進行轉換。 一個這樣的背景是分配。

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引用很容易導致思維誤入歧途。

首先,在java的情況下,使用的術語是對象'reference'而不是'pointer'。 基本上它意味着它是對實際對象的邏輯引用。

正如Lagerbaer已經指出的那樣,它的自動裝箱 - 拆箱是透明的,可以有效地增加值,創建一個新對象,然后將其分配回參考。

所以在增量操作結束時,有兩個對象而不是一個。

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

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

Integer是一個不可變類型,因此您無法更改方法中的值。

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

a++指令之前你有:

      +---------+
a --->| Integer |
b --->|    2    |
      +---------+

ab指向具有值2的相同Integer對象。

使用a++指令,Java autoboxing會自動為您執行以下步驟:

  1. 將值為2的Integer轉換為值為2的基本類型int
  2. 將原始值int增加到3。
  3. 將具有值3的基本類型int轉換為值為3的Integer ,這將為您提供一個新實例。 正如其他人所指出的, Integer是一個不可變類,因此您可以為不同的值獲取不同的對象。

所以你最終得到:

      +---------+         +---------+
a --->| Integer |   b --->| Integer |
      |    2    |         |    3    |
      +---------+         +---------+

你正在遞增a的值,這對a的值沒有任何影響,因為ba無關。

正如肖恩已經回答的那樣,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM