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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nazwy typów pierwotnych pisane są małą literą, a klas - wielką literą. Również nazwy klas są nieco dłuższe: Integer
zamiast int
i Character
zamiast char
.
Wszystkie obiekty klasy opakowującej są niezmienne .
Uproszczony kod klasy Integer
wygląda mniej więcej tak:
Kod | Notatka |
---|---|
|
Wartość zmiennej Konstruktor Metoda zwraca wartość Metoda statyczna tworzy nowy obiekt Integer dla zmiennej typuint |
2. Konwersja typu int
doInteger
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 int
na typ i odwrotnie:Integer
Aby przekonwertować typ int
na type Integer
, musisz napisać kod:
Integer name = new Integer(value);
Gdzie name
jest nazwą zmiennej typu Integer
i value
jest opakowaną wartością typu int
.
Przykłady:
Kod | Notatka |
---|---|
|
|
|
|
|
Aby przekonwertować typ Integer
na type int
, musisz napisać kod:
int name = variable.intValue();
Gdzie name
jest nazwą zmiennej typu int
i variable
jest zmienną odniesienia do obiektu typu Integer
.
Przykłady:
Kod | Notatka |
---|---|
|
|
|
|
|
|
|
|
3. Autoboxing i unboxing
Jednak nawet proste operacje na typach Integer
nie są łatwe do napisania.
Jak już powiedzieliśmy, typ Integer
jest niezmienny ( immutable ). Aby utworzyć obiekt typu Integer
z nową wartością typu int
, należy jawnie utworzyć nowy obiekt Integer
. Z drugiej strony uzyskanie wartości typu int
przechowywanej w obiekcie Integer
jest proste: należy wywołać metodę intValue()
.
Przykład:
Kod | Opis |
---|---|
|
Opakuj to 5 w 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 int
do Integer
nazywana jest autoboxingiem (pudełko - pudełko, włóż do pudełka), a operacja odwrotna - Integer
do int
- unboxingiem .
Twój kod | Co widzi kompilator |
---|---|
|
|
|
|
|
|
Dzięki autoboxingowi i unboxingowi możesz bezpiecznie przypisać typ int
do typu Integer
i odwrotnie. Możesz pisać wyrażenia o dowolnej złożoności i nie rozróżniać typów int
i Integer
.
Przykłady:
Kod | Co wygeneruje kompilator? |
---|---|
|
|
|
|
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 Integer
i Integer
, porównujesz referencje, a nie wartości.
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
|
|
Zmienne nie a
przechowują b
wartoś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 |
---|---|
|
|
GO TO FULL VERSION