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 i 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
), а посилання на об’єкти. Тому важливо пам’ятати, як правильно їх порівнювати:
Неправильно | Правильно |
---|---|
|
|