2014-01-25 3 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. После этого заявления bigDecimal и BigDecimal.ONE больше не указывают на тот же объект.

+0

OK, но когда вы bigDecimal = bigDecimal.add (BigDecimal.ONE); Затем BigDecimal 2 (только протестированы с BigDecimal BigDecimal = BigDecimal.ONE; System.out.println (BigDecimal); BigDecimal = bigDecimal.add (BigDecimal.ONE); System.out.println (BigDecimal) мощность: 2 – user3234625

0

От Java Документация

общественности статической окончательный BigDecimal ONE

Значение 1, с масштабом 0.

Тогда ONE является статическим и является тот же экземпляр объекта на тот же контекст загрузчика классов.

Смежные вопросы