#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 объектом и при инкриментации создается новый объект.
Комментариев нет:
Отправить комментарий