2014-01-25 114 views
0

當你做這樣的事情BigDecimal bigDecimal = BigDecimal.ONE;

BigDecimal bigDecimal = BigDecimal.ONE; 

爲什麼BIGDECIMAL 成爲一個新的對象

+0

比較兩個==('bigDecimal和'BigDecimal.ONE') - 它會返回true,這意味着底層對象是相同的。 – berry120

+0

你爲什麼相信它的確如此。 –

回答

8

在這種情況下,變量(或字段)bigDecimal不會成爲新對象。它只是對由現有靜態字段java.math.BigDecimal.ONE引用的對象的引用。

對象本身(代表1的對象)僅創建一次:加載類BigDecimal時。對於Java 7,這是使用new BigDecimal(BigInteger.ONE, 1, 0, 1)完成的。

您所做的任務優於使用= new BigDecimal(...)自己創建新對象,因爲現有對象已被重新使用。

+0

對不起,但我不明白,如果你那麼bigDecimal = bigDecimal.add(BigDecimal.ONE);那麼bigDecimal就是= 2 – user3234625

+0

'BigDecimal'是不可變的,所以當你賦值'bigDecimal = bigDecimal.add(BigDecimal.ONE)'時,'add'方法返回一個新對象(即'add'不會修改引用到'BigDecimal.ONE')。 – Cascader

+1

更準確地說,它是對現有靜態字段BigDecimal.ONE引用的同一個對象的引用。 (也就是說,它是對象的引用,而不是字段。) – yshavit

1

沒有分配新對象。 bigDecimal指的是與BigDecimal.ONE相同的對象。

如果以後做

bigDecimal = bigDecimal.add(BigDecimal.ONE); 

到另一個對象(其具有值2)的參考將被分配到bigDecimal。在該聲明bigDecimalBigDecimal.ONE之後不再指向同一個對象。

+0

好的,但是當你bigDecimal = bigDecimal.add(BigDecimal.ONE); 的System.out.println(BIGDECIMAL); BIGDECIMAL = bigDecimal.add(BigDecimal.ONE); 的System.out.println(BIGDECIMAL然後BIGDECIMAL是2(只是 的BigDecimal BIGDECIMAL = BigDecimal.ONE測試); 輸出: 2 – user3234625

0

從Java文檔

公共靜態最終的BigDecimal ONE

值1,具有0

然後ONE是靜態的並且是相同的實例對象上的刻度相同的類加載器上下文