#java
Я думал я Java знаю хорошо. Имеем int - примитивный тип. Когда передаем его в метод, то в методе не ссылка на переменную, а лишь копия. Я полагал что Integer, полноценный класс упаковки int передается в метод по ссылке и любые манипуляции с переменной Integer переданные в метод будут происходить непосредственно с той переменной которую мы передали, а не какой то копией. Я не понимаю, почему следующий код работает против моего понимания типов в Java. Integer a=5; inc(a); System.out.println(a); private static void inc(Integer a){ a++; } Output: 5 Объясните, почему 5, а не 6???
Ответы
Ответ 1
Вы все правильно сказали, все аргументы при вызове метода в java передаются по значению, но тут один нюанс. java.lang.Integer является неизменяемым типом, и когда происходит инкрементирование, то выполняется unboxing, увеличение значения и снова упаковка в объект, т.е. создается уже совсем другой объект.Ответ 2
Согласно JLS 15.14.2 The result of the postfix expression must be a variable of a type that is convertible (§5.1.8) to a numeric type... ... the value 1 is added to the value of the variable and the sum is stored back into the variable. Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. Note that the binary numeric promotion mentioned above may include unboxing conversion (§5.1.8) Далее, JLS 5.1.8 гласит: 5.1.8. Unboxing Conversion If r is a reference of type Integer, then unboxing conversion converts r into r.intValue() Таким образом, вычисляется a.intValue(), которое увеличивается на 1. Возвращается к 15.14.2: If necessary, the sum is ... subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored. Таким образом, результат боксируется в Integer, и присваивается локальной переменной a.Ответ 3
В этом предложении a++; объект a распаковывается, создавая временный объект примитивного типа, который увеличивает свое значение. Сам объект a типа Integer остается неизменным.Ответ 4
Integer является immutable объектом и при инкриментации создается новый объект.
Комментариев нет:
Отправить комментарий