Автоупаковка и автораспаковка. Общие понятия. Использование при присваивании (=) и в методах. Примеры
Перед изучением данной темы рекомендуется ознакомиться со следующей темой:
Содержание
- 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
- Типы данных. Примитивные типы. Типы-оболочки
⇑