1. Списък на видовете обвивки

Знаете, че Java има 8 примитивни типа, които са типове, които не са класове. От една страна, това е добре - те са прости и заемат малко място. От друга страна, понякога часовете са точно това, от което се нуждаем. Ще разберете точно защо е така в следващия урок.

И така, Howво може да се направи?

Започвайки с петата version на Java, всеки примитивен тип получи клас близнак. Всеки такъв клас съхранява едно поле със стойност от определен тип. Тези класове се наричат ​​типове обвивки , защото обвиват примитивни стойности в класове.

Ето списък на тези видове. познавате ли такива

Примитивен тип Клас обвивка
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

Имената на примитивните типове започват с малка буква, но имената на класовете обвивки започват с главна буква. Някои от имената на класовете също са малко по-дълги: Integerinstead of intи Characterinstead of char.

Всички обекти на класовете обвивки са непроменими ( неизменни ).

Опростеният code за Integerкласа изглежда така:

Код Забележка
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}




Конструктор на променлива




Методът връща стойност




Статичният метод създава нов Integerобект за intпроменлива

2. Преобразуване на an intв anInteger

Типовете обвивки се считат за двойници на техните примитивни братя и сестри: можете лесно да създадете обект обвивка, който съответства на примитивен тип.

Нека използваме типа int като пример, за да анализираме How примитивните типове взаимодействат със съответните им типове обвивки. Кодът за конвертиране от an intв an Integerи обратно ще изглежда така:

За да конвертирате intв Integer, трябва да напишете този code:

Integer name = new Integer(value);

Къде nameе името на Integerпроменлива и valueе обвитата intстойност.

Примери:

Код Забележка
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

И за да конвертирате an Integerв an int, трябва да напишете този code:

int name = variable.intValue();

Къде nameе името на intпроменлива и variableе препратка към Integerобект.

Примери:

Код Забележка
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. Автобоксиране и разопаковане

Но дори простите операции с Integerтипа не са лесни за писане.

Както казахме по-рано, Integerтипът е непроменим ( immutable ). За да създадете Integerобект с нова intстойност, трябва изрично да създадете нов Integerобект. Това каза, че е лесно да получите стойността на intсъхранена в Integerобект - просто извикайте intValue()метода.

Пример:

Код Описание
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Обвиване 5в Integerобект
Вземете стойността от Integerобекта
Създайте нов Integerобект (равно на 10)

Това е доста тромав code, не мислите ли?

Създателите на Java са мислor така, затова са научor компилатора How да извършва тези операции автоматично. Автоматичното преобразуване на an intв an Integerсе нарича autoboxing (автоматично поставяне на стойността в кутия), а обратната операция (преобразуване на an Integerв an int) се нарича unboxing .

Вашият code Какво вижда компилаторът
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

Благодарение на autoboxing и unboxing, можете безопасно да присвоите an intна Integerпроменлива и обратно. Можете да пишете изрази с всяHowва сложност, без да правите разлика между типовете intи Integer.

Примери:

Код Какво ще генерира компилаторът
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. Сравняване на обвиващи променливи

Autoboxing и unboxing са прости и прозрачни процеси. Използваме new Integer()изрази, ако е необходимо, и извикваме intValue()метода, ако е необходимо.

Всичко работи добре и лесно за вас, програмиста. Имайте предвид, че ако сравнявате an Integerи an Integer, тогава сравнението се основава на референция, а не на стойности.

Код Конзолен изход
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

Променливите aи bне съхраняват intстойности. Те съхраняват препратки към обекти. Това означава, че е важно да запомните How да ги сравнявате правилно:

погрешно вярно
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}