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: Integerzamiast inti Characterzamiast char.
Wszystkie obiekty klas opakowujących są niezmienne ( immutable ).
Uproszczony kod klasy Integerwygląda mniej więcej tak:
| Kod | Notatka |
|---|---|
|
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 |
|---|---|
|
|
|
|
|
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 |
|---|---|
|
|
|
|
|
|
|
|
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 |
|---|---|
|
Zawiń 5obiekt Uzyskaj wartość z obiektu Utwórz nowy Integerobiekt (równy 10)IntegerInteger |
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 |
|---|---|
|
|
|
|
|
|
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 |
|---|---|
|
|
|
|
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 |
|---|---|
|
|
|
|
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 |
|---|---|
|
|
GO TO FULL VERSION