Автоупакування та авторозпакування. Загальні поняття. Використання при присвоєнні (=) та в методах. Приклади
Перед вивченням даної теми рекомендується ознайомитись з наступною темою:
Зміст
- 1. Поняття про автоупакування та авторозпакування. Випадки виникнення та переваги застосування
- 2. Особливості реалізації автоупакування при присвоєнні (=). Приклад
- 3. Приклади автоупакування при присвоєнні (=)
- 4. Приклади авторозпакування при присвоєнні (=)
- 5. Автоупакування та авторозпакування при передачі параметра методу. Приклади
- 5.1. Повернення з методу примітивного типу. Авторозпакування
- 5.2. Повернення з методу типу-оболонки. Автоупакування
- 5.3. Передача в метод який отримує параметр типу-оболонки аргументу примітивного типу. Автоупакування
- 5.4. Передача в метод, який отримує параметр примітивного типу аргументу типу-оболонки. Авторозпакування
- Споріднені теми
Пошук на інших ресурсах:
1. Поняття про автоупакування та авторозпакування. Випадки виникнення та переваги застосування
Автоупакування та авторозпакування з’явилось в Java починаючи з версії JDK 5.
Автоупакування – це процес автоматичного перетворення (інкапсулювання) примітивного типу (int, double, boolean тощо) у відповідну йому оболонку типу (Integer, Double, Boolean тощо) у випадку коли потрібно отримати об’єкт даного типу.
Наприклад, якщо для примітивного типу int потрібно отримати об’єкт, то це буде об’єкт типу Integer. Відповідно конвертування int в Integer називається автоупакуванням.
Авторозпакування – це процес автоматичного витягування значення примітивного типу (int, char, float тощо) з оболонки типу (Integer, Character, Float тощо) в момент, коли потрібно отримати його значення.
Наприклад, якщо з оболонки типу Float отримується значення примітивного типу float, то цей процес відбувається автоматично і називається авторозпакуванням.
Авторозпакування дозволяє уникнути виклику методів на кшталт intValue() чи doubleValue().
Автоупакування та авторозпакування виконуються у наступних випадках:
- при виконанні присвоєння (=);
- при передачі параметру в метод;
- при поверненні з методу;
- при неявному перетворенні у виразах.
Автоупакування та авторозпакування дають наступні переваги:
- відпадає необхідність в ручному упакуванні та розпакуванні значень;
- спрощується реалізація алгоритмів перетворення між примітивними типами та типами-обгортками;
- знижується кількість помилок, що можуть виникати виходячи з цього контексту;
- суттєво полегшується робота з колекціями Java;
- автоупакування дозволяє уникнути явного створення об’єкту.
⇑
2. Особливості реалізації автоупакування при присвоєнні (=). Приклад
При виконанні автоупакування не потрібно створювати об’єкт з допомогою оператора new. Автоупакування здійснюється при виклику оператора присвоєння, який може мати такий вигляд
obj = value;
або
Type obj = value;
тут
- Type – деякий тип-обгортка, що є оболонкою над примітивним типом, якому відповідає значення value. У Java для представлення базових примітивних типів реалізовані наступні типи-обгортки: Double, Float, Long, Integer, Short, Byte, Character, Boolean. Більш детально про типи даних Java можна прочитати тут (2.1…);
- obj – об’єкт (екземпляр) типу-обгортки (Integer, Double, Character тощо);
- value – значення примітивного типу (int, double, char тощо), яке еквівалентне типу об’єкту obj.
⇑
3. Приклади автоупакування при присвоєнні (=)
У прикладі демонструється процес автоупакування для різних типів.
// Автоупакування Boolean B = true; // Boolean <= boolean int i = 28; Integer objInt = i; // Integer <= int float f = 7.58f; Float objFloat = f; // Float <= float double x = 19230.338; Double objDouble; objDouble = x; // Double <= double Character objChar = '+'; // Character <= char short t = 255; Short objShort = t; // Short <= short long l = 2323023933L; Long objLong = l; // Long <= long
⇑
4. Приклади авторозпакування при присвоєнні (=)
Демонструється присвоєння значень типів-оболонок Integer, Character, Boolean, Long значенням примітивних типів int, char, boolean, long.
// Авторозпакування при присвоєнні Integer objI = 25; int i = objI; // int <= Integer Character objC = 'f'; char c; c = objC; // char <= Character Boolean objB = false; boolean b = objB; // boolean <= Boolean Long objL = 2322432342342l; long l = objL; // long <= Long
⇑
5. Автоупакування та авторозпакування при передачі параметра методу. Приклади
Автоупакування відбувається автоматично кожного разу коли примітивний тип перетворюється в об’єкт. Авторозпакування відбувається автоматично коли об’єкт перетворюється в примітивний тип.
Таким чином, ці два процеси відбуваються у випадках, коли метод отримує аргумент або метод повертає деяке значення. Тут розрізняють 4 випадки:
- коли в методі оголошується параметр примітивного типу, а метод отримує аргумент типу-оболонки. У цьому випадку відбувається авторозпакування;
- коли в методі оголошується параметр типу-оболонки, а метод отримує аргумент примітивного типу. У цьому випадку відбувається автоупакування;
- коли в оголошенні методу повертається примітивний тип (оператором return), а тіло методу повертає тип-оболонку. У цьому випадку відбувається авторозпакування;
- коли в оголошенні методу повертається тип-оболонка, а метод повертає примітивний тип. У цьому випадку відбуваєтсья автоупакування.
⇑
5.1. Повернення з методу примітивного типу. Авторозпакування
Демонструється функція Max(), яка визначає максимальне між двома значеннями типу Integer, який є типом-оболонкою. Функція повертає значення примітивного типу int. При цьому відбувається авторозпакування значення типу Integer в значення типу int.
public class TrainAutoPacking { // Авторозпакування. Метод визначає максимальне з двох значень. static int Max(Integer a, Integer b) { Integer max = a; if (a<b) max = b; return max; // Авторозпакування int <= Integer } public static void main(String[] args) { // 1. Оголосити змінні типу-оболонки Integer x = 25; Integer y = 30; // 2. Викликати функцію, відбувається авторозпакування int z = Max(x, y); // int <= Integer - авторозпакування System.out.println(z); // 30 } }
⇑
5.2. Повернення з методу типу-оболонки. Автоупакування
У прикладі оголошується метод Min(), який визначає мінімальне значення між двома цілочисельними значеннями примітивного типу int. Метод повертає об’єкт типу Integer, що є типом-оболонкою для int. При поверненні відбувається автоупакування значення типу int в значення типу Integer.
public class TrainAutoPacking { // Авторозпакування. // Метод визначає мінімальне з двох значень примітивного типу static Integer Min(int a, int b) { int min = a; if (a>b) min = b; return min; // Автоупакування при поверненні } public static void main(String[] args) { // Повернення значення з методу. Автоупакування int x = 30; int y = 22; Integer z; z = Min(x, y); // Integer <= int - автоупакування System.out.println(z); // 22 } }
⇑
5.3. Передача в метод який отримує параметр типу-оболонки аргументу примітивного типу. Автоупакування
У прикладі оголошується метод, що реверсує число. При передачі числа в метод відбувається автоупакування примітивного типу long в тип-оболонку Long.
public class TrainAutoPacking { // Автоупакування. // Метод повертає число, що читається навпаки: 12345 => 54321 static long ReverseNumber(Long number) { // 1. Отримати копію вхідного параметру Long t = number; // 2. Цикл обчислення нового значення number number = 0L; while (t>0) { number = number * 10 + t % 10; t /= 10; } // 3. Повернути результат return number; } public static void main(String[] args) { // Повернення значення з методу. Автоупакування // 1. Задане число long n = 12345L; // 2. Виклик методу, // тип long автоматично упаковується в тип Long long res = ReverseNumber(n); // 3. Вивести результат System.out.println(res); // 54321 } }
⇑
5.4. Передача в метод, який отримує параметр примітивного типу аргументу типу-оболонки. Авторозпакування
Оголошується метод NumDigits(), який визначає кількість цифр у числі. Метод отримує вхідним параметром значення примітивного типу short. При виклику методу з функції main() у нього передається значення типу-оболонки Short. При такому виклику запускається механізм авторозпакування
public class TrainAutoPacking { // Метод, що визначає кількість цифр у числі. static int NumDigits(short number) { int k = 0; while (number>0) { k++; number /= 10; } return k; } public static void main(String[] args) { // 1. Задане число Short num = 21335; // 2. Викликати функцію NumDigits(), // відбувається авторозпакування short <= Short int res = NumDigits(num); // 3. Вивести результат System.out.println(res); // 5 } }
⇑
Споріднені теми
- Автоупакування та авторозпакування у виразах та операторі switch. Використання автоупакування та авторозпакування значень для типів boolean та char
- Типи даних Java. Примітивні типи. Типи-оболонки
- Клас Character. Огляд методів та констант. Конструктор класу
⇑