1. Lista rodzajów opakowań

Wszyscy wiecie, że w Javie istnieje 8 typów pierwotnych, które nie są klasami. Z jednej strony to dobrze: są proste i zajmują mało miejsca, ale z drugiej strony czasem potrzebne są zajęcia. Dlaczego właściwie są, dowiecie się na kolejnym wykładzie.

Więc co robić?

Od wersji 5 Java wprowadziła bliźniacze klasy dla typów pierwotnych. Każda taka klasa przechowuje wewnątrz jednego pola wartość określonego typu. Takie klasy są również nazywane typami opakowującymi , ponieważ w pewnym sensie opakowują prymitywne wartości w klasy.

Oto lista takich typów, rozpoznajesz coś?

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

Nazwy typów pierwotnych pisane są małą literą, a klas - wielką literą. Również nazwy klas są nieco dłuższe: Integerzamiast inti Characterzamiast char.

Wszystkie obiekty klasy opakowującej są niezmienne .

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


Wartość zmiennej

Konstruktor




Metoda zwraca wartość




Metoda statyczna tworzy nowy obiekt Integerdla zmiennej typuint

2. Konwersja typu intdoInteger

Typy opakowujące są uważane za analogiczne do ich bardziej prymitywnych odpowiedników: można łatwo utworzyć odpowiedni obiekt opakowujący dla typu pierwotnego.

Przeanalizujmy interakcję typów pierwotnych i ich typów opakowujących na przykładzie typu int. Oto jak wyglądałby kod konwertujący typ intna typ i odwrotnie:Integer

Aby przekonwertować typ intna type Integer, musisz napisać kod:

Integer name = new Integer(value);

Gdzie name jest nazwą zmiennej typu Integeri value jest opakowaną wartością typu int.

Przykłady:

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

Aby przekonwertować typ Integerna type int, musisz napisać kod:

int name = variable.intValue();

Gdzie namejest nazwą zmiennej typu inti variablejest zmienną odniesienia do obiektu typu Integer.

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

Jednak nawet proste operacje na typach Integernie są łatwe do napisania.

Jak już powiedzieliśmy, typ Integerjest niezmienny ( immutable ). Aby utworzyć obiekt typu Integerz nową wartością typu int, należy jawnie utworzyć nowy obiekt Integer. Z drugiej strony uzyskanie wartości typu intprzechowywanej w obiekcie Integerjest proste: należy wywołać metodę intValue().

Przykład:

Kod Opis
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Opakuj to 5w klasę Integer
Pobierz wartość z obiektu Integer
Utwórz nową wartośćInteger

Kod jest raczej nieporęczny, nie sądzisz?

Twórcy Javy też tak myślą, więc nauczyli kompilator, aby te operacje wykonywał automatycznie. Automatyczna konwersja intdo Integernazywana jest autoboxingiem (pudełko - pudełko, włóż do pudełka), a operacja odwrotna - Integerdo int- unboxingiem .

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ć typ intdo typu Integeri odwrotnie. Możesz pisać wyrażenia o dowolnej złożoności i nie rozróżniać 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 klas opakowujących

Autoboxing i unboxing działają bardzo prosto i przejrzyście: tam, gdzie to konieczne, umieszczane są nowe polecenia new Integer(), tam, gdzie to konieczne, wywoływane są metody intValue().

Dla Ciebie jako programisty wszystko działa łatwo i przejrzyście. Ale zauważ, że jeśli porównujesz Integeri Integer, porównujesz referencje, a nie wartości.

Kod Wyjście na wyświetlaczu
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 nie aprzechowują bwartości (jak typy int), ale odniesienia do obiektów. Dlatego 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))
{
   ...
}