1. Список типів-обгорток
Усі ви знаєте, що в Java є 8 примітивних типів, які не є класами. З одного боку, це добре: вони прості й займають мало місця, а з іншого — іноді потрібні саме класи. Навіщо саме, ви дізнаєтеся з наступної лекції.
То що ж робити?
Починаючи з п'ятої версії Java, у примітивних типів у цій мові з'явилися класи-близнюки. Кожен такий клас зберігає всередині одне поле зі значенням певного типу. Такі класи інакше називають класами-обгортками, тому що вони наче обгортають примітивні значення класами.
Ось список таких типів. Нічого не впізнаєте?
Примітивний тип | Клас-обгортка |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Назви примітивних типів пишуться з малої літери, а класів — з великої. Крім того, назви класів трохи довші: Integer
замість int
і Character
замість char
.
Всі об'єкти класів-обгорток є незмінюваними (immutable).
Спрощений код класу Integer
має приблизно такий вигляд:
Код | Примітка |
---|---|
|
Змінна-значення Конструктор Метод повертає значення Статичний метод створює новий об'єкт Integer для змінної типу int |
2. Перетворення типу int
на Integer
Класи-обгортки вважаються аналогами їхніх примітивніших побратимів: можна легко створити відповідний об'єкт-обгортку для примітивного типу.
Розгляньмо взаємодію примітивних типів і їхніх класів-обгорток на прикладі типу int. Отакий вигляд мав би код перетворення типу int
на клас Integer
і навпаки:
Щоб перетворити тип int
на клас Integer
, потрібно написати такий код:
Integer ім'я = new Integer(значення);
де ім'я
— це ім'я змінної типу Integer
, а значення
— це обгортуване значення типу int
.
Приклади:
Код | Примітка |
---|---|
|
|
|
|
|
А щоб перетворити клас Integer
на тип int
, потрібно написати отакий код:
int ім'я = змінна.intValue();
де ім'я
— це ім'я змінної типу int
, а змінна
— це змінна-посилання на об'єкт типу Integer
.
Приклади:
Код | Примітка |
---|---|
|
|
|
|
|
|
|
|
3. Autoboxing та unboxing
Однак навіть прості операції з класом Integer
писати непросто.
Як ми вже зазначали, об'єкти класу Integer
— незмінювані (immutable). Щоб створити об'єкт класу Integer
з новим значенням типу int
, потрібно явно створити новий об'єкт Integer
. Натомість отримати значення типу int
, яке зберігається всередині об'єкта Integer
, просто: слід викликати метод intValue()
.
Приклад:
Код | Опис |
---|---|
|
Обгортаємо 5 класом Integer Отримуємо значення з об'єкта Integer Створюємо нове значення Integer == 10 |
Код доволі громіздкий, чи не так?
Автори Java теж так вважають, тому вони навчили компілятор виконувати ці операції автоматично. Автоматичне перетворення int
на Integer
називається autoboxing (box — коробка, класти в коробку), а зворотна операція — Integer
на int
— unboxing.
Ваш код | Що бачить компілятор |
---|---|
|
|
|
|
|
|
Завдяки операціям autoboxing і unboxing ви можете спокійно присвоювати тип int
класу Integer
і навпаки. Можна писати вирази будь-якої складності й не робити відмінностей між типами int
і Integer
.
Приклади:
Код | Що згенерує компілятор |
---|---|
|
|
|
|
4. Порівняння змінних класів-обгорток
Autoboxing і unboxing працюють дуже просто й прозоро: де потрібно — розставляють команди new Integer()
, де потрібно — викликають intValue()
.
Для вас, як для програміста, все працює легко й зрозуміло. Але зауважте, що, якщо ви порівнюєте Integer
і Integer
, відбувається порівняння посилань, а не значень.
Код | Виведення на екран |
---|---|
|
|
|
|
Змінні a
і b
зберігають не значення (як типи int
), а посилання на об'єкти. Отож важливо пам'ятати, як їх правильно порівнювати:
Неправильно | Правильно |
---|---|
|
|
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ