Как мы говорили в предыдущем уроке, в 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, который имеет много общих характеристик с простыми объектами данных (например, неизменяемость). Но, учитывая важность строк, мы отложим для них целый урок.