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: Integerzamiast inti Characterzamiast char.
Wszystkie obiekty klasy opakowującej są niezmienne .
Uproszczony kod klasy Integerwygląda mniej więcej tak:
| Kod | Notatka |
|---|---|
|
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 |
|---|---|
|
|
|
|
|
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 |
|---|---|
|
|
|
|
|
|
|
|
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 |
|---|---|
|
Opakuj to 5w klasę IntegerPobierz wartość z obiektu IntegerUtwó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 |
|---|---|
|
|
|
|
|
|
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? |
|---|---|
|
|
|
|
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 |
|---|---|
|
|
|
|
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 |
|---|---|
|
|
GO TO FULL VERSION