Как мы говорили в предыдущем уроке, в Java для каждого примитивного типа существует соответствующий простой объект данных или, как говорится, класс оболочка.
Учитывая примитивный тип (все имена которого начинаются строго с первой строчной буквы), соответствующий объект данных получается, по существу, с заглавной буквы, как показано в следующей таблице:
| Примитивный тип | Класс-оболочка |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
Хотя на первый взгляд может показаться, что есть небольшая разница между примитивным типом и его «обернутым» аналогом (также часто называемым «упакованным в коробку»), между ними существует фундаментальное различие: примитивные типы не являются объектами и у них нет связанного с ними класса, и поэтому они должны обрабатываться иначе, чем другие типы (например, они не могут использоваться в коллекциях, которые будут предметом будущих уроков) и не могут иметь методов.
Чтобы избежать этого различия, Java делает готовые классы доступными для содержания и «оболочки» примитивных типов. Фактически, мы можем думать о классе-оболочке точно так же, как обертка, единственная цель которой — содержать примитивное значение, делая его, с одной стороны, объектом и «украсив» его методами, которые в противном случае не имели бы своего естественного местоположения.
Все классы-оболочки определены в пакете java.lang и квалифицируются как final, поэтому наследовать от них невозможно. Более того, все эти классы неизменяемы, т.е. изменить их значение после построения невозможно.
Хотя Boolean и являются Character производными непосредственно от Object, все объекты данных числового типа являются производными от Number, который, в свою очередь, является прямым потомком Object.

Зачем нужны классы-оболочки в Java?
Разработчиками языка Java было принято очень хорошее решение отделить примитивные типы и классы-оболочки, указав при этом следующее:
- Используйте классы-обертки, когда работаете с коллекциями.
- Используйте примитивные типы для того, чтобы ваши программы были максимально просты.
Еще одним важным моментом является то, что примитивные типы не могут быть null, а классы-оболочки — могут.
От простых типов к объектам данных
Хотя в Java 1.5 введена концепция «автоупаковка и распаковка», которую мы рассмотрим на конкретном уроке, переход от примитивного типа к его обернутой версии в принципе прост, но трудоемок.
Например, обычный int занимает меньше места, и если над ним не планируется проводить особые операции, ваш компьютер будет работать быстрее.
В свою очередь, с помощью класса-оболочки Integer можно выполнять специальные операции — например, перевести текст в число (с помощью метода .parseInt() для Integer-а ). Если попробовать сделать это с помощью кода самому придется изрядно повозиться.
public static void main(String[] args) {
int val = 44;
//для данного примитивного типа создается класс-оболочка
Integer value = new Integer(val);
//значение можно "извлечь" из класса-оболочки
int valueBack = value.intValue();
} Специальные методы парсинга
Классы-оболочки — это также место в Java, где очень полезные методы используются для анализа строк и преобразования их в числовые значения, например:
public static void main(String[] args) {
String fortyThree= "43";
Integer q = new Integer(fortyThree);
} Когда мы используем эти методы для преобразования, нам нужно обрабатывать любое генерирование ошибок. На самом деле не все возможные последовательности символов являются числами, возьмем, например, следующий фрагмент:
public static void main(String[] args) {
String fortyThree= "fortyThree";
Integer q = new Integer(fortyThree);
{ Парсер не сможет успешно обработать строку, и мы получим ошибку, о которой JVM сообщает с помощью исключения NumberFormatException (подробнее об этом позже).
Строка
Среди типов оболочки мы также можем включить тип String, который имеет много общих характеристик с простыми объектами данных (например, неизменяемость). Но, учитывая важность строк, мы отложим для них целый урок.