2014-01-25 111 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是静态的并且是相同的实例对象上的刻度相同的类加载器上下文