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

В разделе "Статьи" можно найти обучающие статьи по информационным технологиям, а также узнать о новостях сервиса Quizful.

Лента обновлений
ссылка Feb 16 15:55
Комментарий от hardcorepony:
хороший вопрос
ссылка Feb 16 15:09
Комментарий от dmitrichek:
Спасибо за полезный тест
ссылка Feb 16 11:49
Добавлен вопрос в тест Photoshop
ссылка Feb 15 19:59
Добавлен вопрос в тест Python 3 Основы
ссылка Feb 15 08:56
Комментарий от VitalyV:
Вопрос некорректный. Объединяют как было верно выше упом...
Статистика

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

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