Топ контрибуторов
loading
loading
Знаете ли Вы, что

Если у вас есть уникальная статья и вы хотите, чтобы она стала достоянием общественности, вы можете разместить ее на Quizful.

Лента обновлений
ссылка Sep 18 16:14
Добавлен вопрос в тест Java - Эксперт
ссылка Sep 18 14:11
Комментарий от karpmoney:
Двусвязный список - каждый элемент списка имеет ссылку...
ссылка Sep 17 17:59
Комментарий от Handsome911:
varargs

https://docs.oracle.com/javase/1.5.0/docs/g...
ссылка Sep 17 16:11
Добавлен вопрос в тест C# - Средний уровень
ссылка Sep 16 09:47
Комментарий от dmytro_kudryk:
Как для основ, достаточно содержательный тест!
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 441071 / 2165236.

Java / Автоупаковка примитивов в Java

Автор: shual  к списку      

Вопрос
Что такое autoboxing в Java и каковы правила автоупаковки примитивных типов в классы-обертки?
Ответ
Автоупаковка это механизм неявной инициализации объектов классов-оберток (Byte, Short, Character, Integer, Long, Float, Double) значениями соответствующих им исходных примитивных типов (соотв. byte, short, char, int, long, float, double), без явного использования конструктора класса.
Автоупаковка происходит при прямом присвоении примитива - классу-обертке (с помощью оператора"="), либо при передаче примитива в параметры метода (типа "класса-обертки"). Автоупаковке в "классы-обертки" могут быть подвергнуты как переменные примитивных типов, так и константы времени компиляции(литералы и final-примитивы). При этом литералы должны быть синтаксически корректными для инициализации переменной исходного примитивного типа.

Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива - типу "класса-обертки".
Например, попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции.

Автоупаковка констант примитивных типов допускает более широкие границы соответствия. В этом случае компилятор способен предварительно осуществлять неявное расширение/сужение типа примитивов. Преобразование происходит в два этапа:
1) неявное расширение(сужение) исходного типа примитива до типа примитива соответствующего классу-обертке (для преобразования int->Byte, сначала компилятор неявно сужает int в byte)
2) автоупаковку примитива в соотвествующий "класс-обертку" (компилятор автоупаковывает byte->Byte). однако в этом случае существуют два дополнительных ограничения:
a) присвоение примитива - "обертке" может производится только оператором "=" (нельзя передать такой примитив в параметры метода , без явного приведения типов)
b) тип левого операнда не должен быть старше чем Character, тип правого не дожен старше чем int, (допустимо расширение/сужение byte <-> short, byte <-> char, short <-> char
и только сужение byte <- int, short <- int, char <- int, все остальные варианты требуют явного приведения типов)

Дополнительная особенность целочисленных "классов-оберток" созданных автоупаковкой констант в диапазоне -128 +127 , в то что они кэшируются JVM. Потому такие обертки с одинаковыми значениями будут являтся ссылками на один объект.

Если Вам понравился вопрос, проголосуйте за него

Голосов: 27  loading...
andrew_aa0mail   pikaboom   vad9mko   answer42   vvkvvk   kira_shtorm   humb1t   Zerus   arnost   Kirill_snk   kir_jacob   fil7   Sunrise123   Russa   dcba1257908   Letos   Ronny147   dimaatkaev   AARomanov1985   Vikky_Leto   panser   LincolnShow   voyager42   Nata22   loneliness   Blade_Master   san4osq