Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

Integer которые передается в static метод, передается как ссылочный Object?

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

Комментариев нет:

Отправить комментарий