Классы обертки в Java

С классами обертками мы уже неявно познакомились, когда изучали коллекции. У многих мог возникнуть вопрос: зачем задавать целочисленную переменную не int, а Integer. Все дело в том, что коллекции это набор объектов и для того, чтобы оперировать примитивными типами как объектами и были придуманы классы обертки.

Стоить уточнить, что в данной статье будут рассмотрены только классы обертки для примитивных типов данных.

Данные классы имеют название от примитивного типа данных, который они представляют: DoubleFloatLongIntegerShortByteCharacter, Boolean. 

auboxoxing

Данные классы очень напоминают класс String. Объект обертку для примитивного типа можно создать как явно (используя конструктор), так и не явно (прямым присвоением примитива классу обертке) с помощью оператора»=» либо при передаче примитива в параметры метода (типа «класса-обертки»). Последнее еще называют автоупакова (autoboxing).

Код    
  1. package com.javamaster;
  2.  
  3. public class AutoBoxingExample {
  4.    
  5.     public static void main(String[] args){
  6.         Integer a = new Integer(5);//явное создание переменной обертки
  7.        
  8.         int b = a;//неявное создание... 
  9.     }
  10. }

Как и все объекты, переменные созданы с помощью классов оберток будут храниться в куче (heap). НО, есть одно важное замечание, о котором часто любят спрашивать в тестах или собеседованиях. Оно касается целочисленных классов оберток. Неявное создание таких переменных со значением в диапазоне -128 +127 будут храниться в пуле о котором мы говорили в статье о String. Потому такие обертки с одинаковыми значениями будут являться ссылками на один объект.

Классы обертки

Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива — типу «класса-обертки». Попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции. О приведении типов мы уже писали.

Код    
  1. package com.javamaster;
  2.  
  3. public class AutoBoxingExample {
  4.    
  5.     public static void main(String[] args){
  6.         Integer a = new Integer(5);
  7.         Integer b = new Integer(5);
  8.         b = new Integer(3);
  9.        
  10.         System.out.println("a = "+a);
  11.        
  12.         Integer c = new Integer(444);
  13.         Integer d = new Integer(444);
  14.         d = new Integer(456);
  15.    
  16.         System.out.println("d = "+d);
  17.    
  18.     }
  19.  
  20. }

Результат работы программы:

a = 5
d = 456

Классы обертки удобны еще тем, что они предоставляют методы для работы с соответственными типами данных.

Давайте посмотрим на самые популярные:

Код    
  1. package com.javamaster;
  2.  
  3. public class AutoBoxingExample {
  4.    
  5.     public static void main(String[] args){
  6.         String a = "45";
  7.         double b = Double.parseDouble(a);//пожалуй, самый популярный метод перевод из строки в целочисленный или дробный тип
  8.         int c = Integer.parseInt(a);
  9.         System.out.println(b);
  10.         System.out.println(c);
  11.        
  12.        
  13.         System.out.println(Integer.MAX_VALUE);//константа максимального значения
  14.        
  15.         System.out.println(Integer.bitCount(78));// в двоичном виде
  16.        
  17.         System.out.println(Float.valueOf("80"));//возвращает целочисленный объект, содержащий значение указанного типа
  18.        
  19.         System.out.println(Integer.valueOf("444",16)); //возвращает целочисленный объект, содержащий целое значение указанного строкового представления,
  20.         //разобранного со значением системы счисления
  21.     }
  22.  
  23. }

Хотелось бы еще рассмотреть создание Boolean переменной. Этот вопрос встречается достаточно часто в тестах:

Код    
  1. package com.javamaster;
  2.  
  3. public class BooleanExample {
  4.    
  5.     public static void main(String[] args){
  6.         Boolean b1 = new Boolean(false);//false
  7.         Boolean b2 = new Boolean("false");//false
  8.         Boolean b3 = new Boolean(true);//true
  9.         Boolean b4 = new Boolean("true");//true
  10.         Boolean b5 = new Boolean("hi there");//false
  11.  
  12.     }
  13.  
  14. }

На самом деле методов очень много, но это самые популярные и самые используемые для меня.

Вот и все, что касается классов оберток для примитивных типов данных. Теперь Вы сможете оперировать примитивными типами, как объектами.

One thought on “Классы обертки в Java

  1. По поводу автообертки булиан переменых очень часто встречал на тестах, но на собеседованиях почему-то ни разу не спрашивали)

Добавить комментарий