Try English version of Quizful



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

Свои вопросы для тестов можно добавлять на странице с информацией о тесте. При этом для некоторых тестов добавление вопросов закрыто

Лента обновлений
ссылка Jun 23 18:26
Комментарий от Bawarez:
не путайте понятия "знание работы с символами" и "знание...
ссылка Jun 23 02:39
Комментарий от Cat909:
Есть ошибка в тексте вопроса; правильно будет "реализоват...
ссылка Jun 22 17:04
Комментарий от MiXProjecT:
Правильный ответ "Ошибка выполнения запроса". Провере...
ссылка Jun 22 15:47
Комментарий от bugnet425:
Решение через систему уравнений в один цикл за один пр...
ссылка Jun 22 13:33
Комментарий от dieselok161:
Либо объясните, либо удалите этот вопрос)))
Статистика

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

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...
vvkvvk   andrew_aa0mail   fil7   san4osq   Blade_Master   kir_jacob   dimaatkaev   voyager42   Kirill_snk   Vikky_Leto   panser   Russa   Zerus   Ronny147   LincolnShow   answer42   pikaboom   loneliness   Sunrise123   humb1t   AARomanov1985   kira_shtorm   Letos   dcba1257908   Nata22   arnost