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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: Integer
zamiast int
i Character
zamiast char
.
Wszystkie obiekty klas opakowujących są niezmienne ( immutable ).
Uproszczony kod klasy Integer
wygląda mniej więcej tak:
Kod | Notatka |
---|---|
|
Konstruktor zmiennej Metoda zwraca wartość Metoda statyczna tworzy nowy Integer obiekt dla int zmiennej |
2. Konwersja an int
na 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 int
na an Integer
i odwrotnie wyglądałby tak:
Aby przekonwertować an int
na Integer
, musisz napisać ten kod:
Integer name = new Integer(value);
Gdzie name
jest nazwą zmiennej Integer
i value
jest opakowaną int
wartością.
Przykłady:
Kod | Notatka |
---|---|
|
|
|
|
|
Aby przekonwertować an Integer
na an int
, musisz napisać ten kod:
int name = variable.intValue();
Gdzie name
jest nazwą zmiennej int
i variable
jest odniesieniem do Integer
obiektu.
Przykłady:
Kod | Notatka |
---|---|
|
|
|
|
|
|
|
|
3. Autoboxing i unboxing
Ale nawet proste operacje na Integer
typie nie są łatwe do napisania.
Jak powiedzieliśmy wcześniej, Integer
typ jest niezmienny ( immutable ). Aby utworzyć Integer
obiekt z nową int
wartością, musisz jawnie utworzyć nowy Integer
obiekt. To powiedziawszy, łatwo jest uzyskać wartość przechowywaną int
wewnątrz Integer
obiektu — po prostu wywołaj intValue()
metodę.
Przykład:
Kod | Opis |
---|---|
|
Zawiń 5 obiekt Uzyskaj wartość z obiektu Utwórz nowy Integer obiekt (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 int
na an Integer
nazywana jest autoboxingiem (automatyczne umieszczanie wartości w pudełku), a operacja odwrotna (konwersja an Integer
na an int
) nazywana jest unboxing .
Twój kod | Co widzi kompilator |
---|---|
|
|
|
|
|
|
Dzięki autoboxingowi i unboxingowi możesz bezpiecznie przypisać an int
do Integer
zmiennej i odwrotnie. Możesz pisać wyrażenia o dowolnej złożoności bez rozróżniania typów int
i Integer
.
Przykłady:
Kod | Co wygeneruje kompilator |
---|---|
|
|
|
|
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 Integer
i an Integer
, to porównanie jest oparte na referencjach, a nie na wartościach.
Kod | Wyjście konsoli |
---|---|
|
|
|
|
Zmienne a
i b
nie przechowują int
wartoś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 |
---|---|
|
|
GO TO FULL VERSION