1. Lista rodzajów opakowań

Wiesz, że Java ma 8 typów pierwotnych, które nie są klasami. Z jednej strony to dobrze — są proste i zajmują mało miejsca. Z drugiej strony, czasami zajęcia są tym, czego potrzebujemy. Dowiesz się dokładnie, dlaczego tak jest w następnej lekcji.

Co więc można zrobić?

Począwszy od piątej wersji Javy, każdy prymitywny typ zyskał bliźniaczą klasę. Każda taka klasa przechowuje pojedyncze pole z wartością określonego typu. Klasy te nazywane są typami opakowującymi , ponieważ opakowują wartości pierwotne w klasach.

Oto lista tych typów. Czy znasz jakieś?

Typ pierwotny Klasa opakowania
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

Nazwy typów pierwotnych zaczynają się od małej litery, ale nazwy klas opakowujących zaczynają się od dużej litery. Niektóre nazwy klas są również nieco dłuższe: Integerzamiast inti Characterzamiast char.

Wszystkie obiekty klas opakowujących są niezmienne ( immutable ).

Uproszczony kod klasy Integerwygląda mniej więcej tak:

Kod Notatka
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);
   }
}




Konstruktor zmiennej




Metoda zwraca wartość




Metoda statyczna tworzy nowy Integerobiekt dla intzmiennej

2. Konwersja an intna anInteger

Typy opakowujące są uważane za odpowiedniki ich prymitywnych rodzeństwa: można łatwo utworzyć obiekt opakowujący, który odpowiada typowi pierwotnemu.

Użyjmy typu int jako przykładu do analizy interakcji typów pierwotnych z odpowiadającymi im typami opakowania. Kod konwersji z an intna an Integeri odwrotnie wyglądałby tak:

Aby przekonwertować an intna Integer, musisz napisać ten kod:

Integer name = new Integer(value);

Gdzie namejest nazwą zmiennej Integeri valuejest opakowaną intwartością.

Przykłady:

Kod Notatka
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

Aby przekonwertować an Integerna an int, musisz napisać ten kod:

int name = variable.intValue();

Gdzie namejest nazwą zmiennej inti variablejest odniesieniem do Integerobiektu.

Przykłady:

Kod Notatka
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. Autoboxing i unboxing

Ale nawet proste operacje na Integertypie nie są łatwe do napisania.

Jak powiedzieliśmy wcześniej, Integertyp jest niezmienny ( immutable ). Aby utworzyć Integerobiekt z nową intwartością, musisz jawnie utworzyć nowy Integerobiekt. To powiedziawszy, łatwo jest uzyskać wartość przechowywaną intwewnątrz Integerobiektu — po prostu wywołaj intValue()metodę.

Przykład:

Kod Opis
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Zawiń 5obiekt Uzyskaj wartość z obiektu Utwórz nowy Integerobiekt (równy 10)
Integer
Integer

To raczej nieporęczny kod, nie sądzisz?

Twórcy Javy tak myśleli, więc nauczyli kompilator, jak wykonywać te operacje automatycznie. Automatyczna konwersja an intna an Integernazywana jest autoboxingiem (automatyczne umieszczanie wartości w pudełku), a operacja odwrotna (konwersja an Integerna an int) nazywana jest unboxing .

Twój kod Co widzi kompilator
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);

Dzięki autoboxingowi i unboxingowi możesz bezpiecznie przypisać an intdo Integerzmiennej i odwrotnie. Możesz pisać wyrażenia o dowolnej złożoności bez rozróżniania typów inti Integer.

Przykłady:

Kod Co wygeneruje kompilator
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. Porównanie zmiennych opakowujących

Autoboxing i unboxing to proste i przejrzyste procesy. W razie potrzeby używamy new Integer()instrukcji i wywołujemy intValue()metodę w razie potrzeby.

Wszystko działa ładnie i łatwo dla ciebie, programisty. Pamiętaj, że jeśli porównujesz an Integeri an Integer, to porównanie jest oparte na referencjach, a nie na wartościach.

Kod Wyjście konsoli
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

Zmienne ai bnie przechowują intwartości. Przechowują odniesienia do obiektów. Oznacza to, że ważne jest, aby pamiętać, jak prawidłowo je porównywać:

Zło Prawidłowy
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}