Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

После прохождения теста можно комментировать вопросы теста, а Ваши комментарии увидят модераторы теста и пользователи, которым когда-либо эти вопросы попадались.

Лента обновлений
ссылка Sep 24 20:31
Комментарий от Anton__1998:
Вот это да.
ссылка Sep 24 07:08
Добавлен вопрос в тест C# - Средний уровень
ссылка Sep 24 03:33
Комментарий от Myxach:
Хмм, мне кажется или такие конструкции желательно не допу...
ссылка Sep 23 23:56
Добавлен вопрос в тест PHP 4 - Средний уровень
ссылка Sep 23 22:39
Комментарий от k0nstant1n:
Интересно, такие операторы где-то на практике использ...
Статистика

Тестов: 152, вопросов: 8545. Пройдено: 380735 / 1844242.

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. Потому такие обертки с одинаковыми значениями будут являтся ссылками на один объект.

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

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