Ответ
инструментария выше является правильным и наилучшим способом, но он не дает полного объяснения того, что происходит.
Предполагая Java 5 или более позднюю версию:
Integer a = new Integer(2); // or even just Integer a = 2;
a *= 10;
System.out.println(a); // will output 20
Что вам нужно знать, так это то, что вы делаете:
Integer a = new Integer(2); // or even just Integer a = 2;
a = a.intValue() * 10;
System.out.println(a.intValue()); // will output 20
Выполняя операцию (в данном случае * =) над объектом «a», вы не изменяете значение int внутри объекта «a», а фактически присваиваете новый объект «a».
Это связано с тем, что «a» автоматически распаковывается для выполнения умножения, а затем результат умножения автоматически упаковывается и присваивается «a».
Целое число - неизменный объект. (Все классы-обёртки неизменны.)
Возьмем, к примеру, этот кусок кода:
static void test() {
Integer i = new Integer(10);
System.out.println("StartingMemory: " + System.identityHashCode(i));
changeInteger(i);
System.out.println("Step1: " + i);
changeInteger(++i);
System.out.println("Step2: " + i.intValue());
System.out.println("MiddleMemory: " + System.identityHashCode(i));
}
static void changeInteger(Integer i) {
System.out.println("ChangeStartMemory: " + System.identityHashCode(i));
System.out.println("ChangeStartValue: " + i);
i++;
System.out.println("ChangeEnd: " + i);
System.out.println("ChangeEndMemory: " + System.identityHashCode(i));
}
Вывод будет:
StartingMemory: 1373539035
ChangeStartMemory: 1373539035
ChangeStartValue: 10
ChangeEnd: 11
ChangeEndMemory: 190331520
Step1: 10
ChangeStartMemory: 190331520
ChangeStartValue: 11
ChangeEnd: 12
ChangeEndMemory: 1298706257
Step2: 11
MiddleMemory: 190331520
Вы можете видеть, что адрес памяти для 'i' меняется (ваши адреса памяти будут другими).
Теперь давайте сделаем небольшой тест с отражением, добавьте его в конец метода test ():
System.out.println("MiddleMemory: " + System.identityHashCode(i));
try {
final Field f = i.getClass().getDeclaredField("value");
f.setAccessible(true);
f.setInt(i, 15);
System.out.println("Step3: " + i.intValue());
System.out.println("EndingMemory: " + System.identityHashCode(i));
} catch (final Exception e) {
e.printStackTrace();
}
Дополнительный вывод будет:
MiddleMemory: 190331520
Step2: 15
MiddleMemory: 190331520
Вы можете видеть, что адрес памяти для 'i' не изменился, хотя мы изменили его значение с помощью отражения.
(НЕ ИСПОЛЬЗУЙТЕ ОТРАЖЕНИЕ ЭТОГО СПОСОБА В РЕАЛЬНОЙ ЖИЗНИ !!)