Для чего нужны классы обертки java
Урок 5. Классы обертки
Как мы говорили в предыдущем уроке, в Java для каждого примитивного типа существует соответствующий простой объект данных или, как говорится, класс оболочка.
Учитывая примитивный тип (все имена которого начинаются строго с первой строчной буквы), соответствующий объект данных получается, по существу, с заглавной буквы, как показано в следующей таблице:
Примитивный тип | Класс-оболочка |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Хотя на первый взгляд может показаться, что есть небольшая разница между примитивным типом и его «обернутым» аналогом (также часто называемым «упакованным в коробку»), между ними существует фундаментальное различие: примитивные типы не являются объектами и у них нет связанного с ними класса, и поэтому они должны обрабатываться иначе, чем другие типы (например, они не могут использоваться в коллекциях, которые будут предметом будущих уроков) и не могут иметь методов.
Чтобы избежать этого различия, Java делает готовые классы доступными для содержания и «оболочки» примитивных типов. Фактически, мы можем думать о классе-оболочке точно так же, как обертка, единственная цель которой — содержать примитивное значение, делая его, с одной стороны, объектом и «украсив» его методами, которые в противном случае не имели бы своего естественного местоположения.
Зачем нужны классы-оболочки в Java?
Разработчиками языка Java было принято очень хорошее решение отделить примитивные типы и классы-оболочки, указав при этом следующее:
Еще одним важным моментом является то, что примитивные типы не могут быть null, а классы-оболочки — могут.
От простых типов к объектам данных
Хотя в Java 1.5 введена концепция «автоупаковка и распаковка», которую мы рассмотрим на конкретном уроке, переход от примитивного типа к его обернутой версии в принципе прост, но трудоемок.
Например, обычный int занимает меньше места, и если над ним не планируется проводить особые операции, ваш компьютер будет работать быстрее.
Специальные методы парсинга
Классы-оболочки — это также место в Java, где очень полезные методы используются для анализа строк и преобразования их в числовые значения, например:
Когда мы используем эти методы для преобразования, нам нужно обрабатывать любое генерирование ошибок. На самом деле не все возможные последовательности символов являются числами, возьмем, например, следующий фрагмент:
Парсер не сможет успешно обработать строку, и мы получим ошибку, о которой JVM сообщает с помощью исключения NumberFormatException (подробнее об этом позже).
Строка
Среди типов оболочки мы также можем включить тип String, который имеет много общих характеристик с простыми объектами данных (например, неизменяемость). Но, учитывая важность строк, мы отложим для них целый урок.
Классы обертки в Java
С классами обертками мы уже неявно познакомились, когда изучали коллекции. У многих мог возникнуть вопрос: зачем задавать целочисленную переменную не int, а Integer. Все дело в том, что коллекции это набор объектов и для того, чтобы оперировать примитивными типами как объектами и были придуманы классы обертки.
Стоить уточнить, что в данной статье будут рассмотрены только классы обертки для примитивных типов данных.
Данные классы имеют название от примитивного типа данных, который они представляют: Double, Float, Long, Integer, Short, Byte, Character, Boolean.
Данные классы очень напоминают класс String. Объект обертку для примитивного типа можно создать как явно (используя конструктор), так и не явно (прямым присвоением примитива классу обертке) с помощью оператора»=» либо при передаче примитива в параметры метода (типа «класса-обертки»). Последнее еще называют автоупакова (autoboxing).
public class AutoBoxingExample <
public static void main ( String [ ] args ) <
Integer a = new Integer ( 5 ) ; //явное создание переменной обертки
int b = a ; //неявное создание.
>
>
Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива — типу «класса-обертки». Попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции. О приведении типов мы уже писали.
public class AutoBoxingExample <
public static void main ( String [ ] args ) <
Integer a = new Integer ( 5 ) ;
Integer b = new Integer ( 5 ) ;
b = new Integer ( 3 ) ;
Integer c = new Integer ( 444 ) ;
Integer d = new Integer ( 444 ) ;
d = new Integer ( 456 ) ;
Результат работы программы:
Классы обертки удобны еще тем, что они предоставляют методы для работы с соответственными типами данных.
Давайте посмотрим на самые популярные:
public class AutoBoxingExample <
Хотелось бы еще рассмотреть создание Boolean переменной. Этот вопрос встречается достаточно часто в тестах:
public class BooleanExample <
public static void main ( String [ ] args ) <
Boolean b1 = new Boolean ( false ) ; //false
Boolean b2 = new Boolean ( «false» ) ; //false
Boolean b3 = new Boolean ( true ) ; //true
Boolean b4 = new Boolean ( «true» ) ; //true
Boolean b5 = new Boolean ( «hi there» ) ; //false
На самом деле методов очень много, но это самые популярные и самые используемые для меня.
Вот и все, что касается классов оберток для примитивных типов данных. Теперь Вы сможете оперировать примитивными типами, как объектами.
Классы-оболочки в Java
Взгляните на классы-оболочки в Java и на то, как работают примитивы бокса и распаковки.
1. Обзор
Как следует из названия, классы-оболочки – это объекты, инкапсулирующие примитивные типы Java.
Каждый примитив Java имеет соответствующую оболочку:
2. Классы обертки
Например, фреймворк коллекции Java работает исключительно с объектами. Давным-давно (до Java 5, почти 15 лет назад) не было автобоксов, и мы, например, не могли просто вызвать add(5) для набора целых чисел.
В то время эти примитивные значения должны были быть вручную преобразованы в соответствующие классы-оболочки и сохранены в коллекциях.
3. Преобразование примитива в класс-оболочку
Теперь большой вопрос: как мы преобразуем примитивное значение в соответствующий класс-оболочку, например, int в Целое число или char в Символ?
Ну, мы можем использовать либо конструкторские, либо статические фабричные методы для преобразования примитивного значения в объект класса-оболочки.
Однако начиная с Java 9 конструкторы для многих коробочных примитивов, таких как Integer | или Long , устарели.
Давайте рассмотрим пример преобразования значения int в объект Integer в Java:
С другой стороны, для преобразования объекта-оболочки в примитивное значение мы можем использовать соответствующий метод, такой как intValue(), doubleValue () |/и т. Д:
4. Автобокс и распаковка
В предыдущем разделе мы показали, как вручную преобразовать примитивное значение в объект.
После Java 5 это преобразование может быть выполнено автоматически с помощью функций, называемых автобоксом и распаковкой.
“Бокс” относится к преобразованию примитивного значения в соответствующий объект-оболочку. Поскольку это может произойти автоматически, это называется автобоксом.
Аналогично, когда объект-оболочка разворачивается в примитивное значение, это называется распаковкой.
В этом примере Java автоматически преобразует значение примитива int в оболочку.
Внутренне он использует метод valueOf() для облегчения преобразования. Например, следующие строки эквивалентны:
Подобно автобоксу, распаковка выполняется автоматически при передаче объекта методу, ожидающему примитив, или при назначении его переменной примитива:
В принципе, если мы напишем метод, который принимает примитивное значение или объект-оболочку, мы все равно сможем передать им оба значения. Java позаботится о передаче правильного типа, например, примитива или оболочки, в зависимости от контекста.
5. Заключение
В этом кратком руководстве мы говорили о классах-оболочках в Java, а также о механизме автобокса и распаковки.
Типы-обертки в Java
1. Список типов-оберток
Все вы знаете, что в Java есть 8 примитивных типов, которые не являются классами. С одной стороны, это хорошо: они простые и занимают мало места, а с другой — иногда нужны именно классы. Зачем именно они, вы узнаете в следующей лекции.
Вот список таких типов, ничего не узнаете?
Примитивный тип | Класс-обертка |
---|
Все объекты классов-оберток являются неизменяемыми ( immutable ).
Упрощенный код класса Integer выглядит примерно так:
Метод возвращает значение
Статический метод создает новый объект Integer для переменной типа int
2. Преобразование типа int к Integer
Типы-обертки считаются аналогами их более примитивных собратьев: можно легко создать соответствующий объект-обертку для примитивного типа.
Разберем взаимодействие примитивных типов и их типов-оберток на примере типа int. Вот как бы выглядел код преобразования типа int к типу Integer и наоборот:
3. Autoboxing и unboxing
Однако даже простые операции с типом Integer писать непросто.
Код | Описание |
---|---|
Оборачиваем 5 в класс Integer Получаем значение из объекта Integer Создаем новое значение Integer == 10 |
Код довольно громоздкий, не находите?
Ваш код | Что видит компилятор |
---|
Код | Что сгенерирует компилятор |
---|
4. Сравнение переменных классов-оберток
Код | Вывод на экран |
---|
Переменные a и b хранят не значения (как типы int ), а ссылки на объекты. Поэтому важно помнить, как правильно их сравнивать:
Классы-оболочки в Java — руководство с примерами
Классы-оболочки Java являются Объектным представлением восьми примитивных типов в Java. Все классы-оболочки в Java являются неизменными и final. Начиная с Java 5 автоупаковка и распаковка позволяет легко конвертировать примитивные типы в их соответствующие классы-оболочки и наоборот.
В таблице ниже показаны примитивные типы и их классы-обертки в Java
Примитивный тип | Класс-обертка | Аргументы |
byte | Byte | byte или String |
short | Short | short или String |
int | Integer | int или String |
long | Long | long или String |
float | Float | float, double или String |
double | Double | double или String |
char | Character | char |
boolean | Boolean | boolean или String |
Зачем нужны классы-оболочки в Java?
Разработчиками языка Java было принято очень умное решение отделить примитивные типы и классы-оболочки, указав при этом следующее:
Еще одним важным моментом является то, что примитивные типы не могут быть null, а классы-оболочки — могут.
Также классы-оболочки могут быть использованы для достижения полиморфизма.
Вот простая программа, показывающая различные аспекты классов-оболочек в Java :