Автоупаковка и автораспаковка в выражениях и операторе switch. Использование автоупаковки и автораспаковки значений для типов boolean и char
Содержание
- 1. Автоупаковка и автораспаковка в выражениях. Особенности реализации
- 2. Примеры автоупаковки и автораспаковки в выражениях
- 3. Примеры автоупаковки и автораспаковки в операторе switch
- 4. Автоупаковка и автораспаковка значений между типами boolean и Boolean. Особенности применения
- 5. Автоупаковка и автораспаковка значений между типами char и Character
- Связанные темы
Поиск на других ресурсах:
1. Автоупаковка и автораспаковка в выражениях. Особенности реализации
Автоупаковка и автораспаковка выполняются в выражениях в случаях, когда требуется взаимное преобразование значения примитивного типа и соответствующего объекта типа оболочки.
Если числовое значение является упакованным в объект типа оболочки, то при использовании в выражениях, содержащих операции (+, –, *, ++, – и т.д.) это значение предварительно распаковывается.
Также значение объекта типа оболочки распаковывается при использовании в операторе switch.
Допускается выполнять операции в выражениях над упакованными объектами разных типов оболочек (Integer, Double, Float и т.п.).
⇑
2. Примеры автоупаковки и автораспаковки в выражениях
2.1. Бинарная операция +
Пример показывает процесс распаковки при добавлении двух значений, являющихся объектами типов оболочек. По схожему принципу работают другие операции -, *, /, % и т. д.
// Автоупаковка и автораспаковка в выражениях // 1. Бинарная операция + Double objD1, objD2; Double resD; objD1 = 25.5; // упаковка Double <= double objD2 = 30.5; // упаковка Double <= double // 2. Операция суммирования. // 2.1. Распаковка objD1, objD2. // 2.2. Вычисление суммы 25.5+30.5 => 56.0 // 2.3. Упаковка 56.0 => Double resD = objD1 + objD2;
В вышеприведенном примере в строке
resD = objD1 + objD2;
выполняется следующая последовательность действий:
- распаковываются объекты objD1 и objD2 и получаются значения 25.5 и 30.5 примитивного типа double;
- вычисляется сумма для примитивного типа double;
- результат вычисления суммы упаковывается в объект resD.
⇑
2.2. Инкремент ++
Пример показывает использование операции инкремента для объекта типа оболочки. Такой же принцип выполнения осуществляется при использовании операции декремента —.
// Автоупаковка и автораспаковка в выражениях // Операция инкремента ++ // 1. Объявление переменной Integer objI = 40; // упаковка Integer <= int // 2. Вызов оператора ++ // 2.1. Распаковка значения 40 в тип int // 2.2. Приращение значения int на 1, получается 41 // 2.3. Упаковка значения 41 в оболочку Integer objI++;
В вышеприведенном примере в строке
objI++;
выполняются следующие действия:
- сначала значение объекта objI распаковывается;
- происходит приращение на 1 значения объекта objI. В результате объект objI имеет значение 41;
- результат упаковывается в оболочку Integer.
⇑
3. Примеры автоупаковки и автораспаковки в операторе switch
В примере демонстрируется использование процесса автораспаковки в операторе switch. Введенный день недели имеет тип-оболочку Integer. В операторе switch этот день недели выступает управляющим выражением. При сравнении в операторах case происходит автоматическая распаковка из типа Integer в тип int.
import java.util.Scanner; public class TrainAutoPacking { public static void main(String[] args) { // Автоупаковка и автораспаковка в операторе switch // 1. Ввести день недели, который имеет тип Integer Scanner input = new Scanner(System.in); System.out.print("day = "); Integer dayWeek = input.nextInt(); // 2. Использование типа Integer в качестве управляющего выражения в операторе switch // Здесь происходит распаковка значения объекта dayWeek в значение типа int switch (dayWeek) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saturday"); break; case 7: System.out.println("Sunday"); break; default: System.out.println("Incorrect day"); } input.close(); } }
⇑
4. Автоупаковка и автораспаковка значений между типами boolean и Boolean. Особенности применения
Процесс автоупаковки и автораспаковки для логического типа используется, когда требуется взаимное преобразование между примитивным типом boolean и типом оболочкой Boolean. Это преобразование может возникать в следующих случаях:
- при присваивании (=) переменной типа boolean объекта типа оболочки Boolean. В этом случае происходит автораспаковка (boolean <= Boolean);
- при присваивании (=) объекту типа оболочки Boolean значения переменной примитивного типа boolean. В этом случае происходит автоупаковка (Boolean<=boolean);
- в операторе условного перехода if, когда в качестве условия используется объект типа-оболочки Boolean. В этом случае логическое значение автоматически распаковывается в тип boolean;
- во всех операторах цикла for, while, do-while, при условии, что в качестве условия выполнения итерации используется объект типа оболочки Boolean. В этом случае происходит автораспаковка объекта типа Boolean в примитивный тип boolean.
⇑
4.1. Использование в операторах присваивания
// Автоупаковка и автораспаковка для типа Boolean // Автоупаковка Boolean <= boolean Boolean objB = true; // Автораспаковка boolean <= Boolean boolean b = ! objB; // false
⇑
4.2. Использование в операторе условного перехода if
// Автоупаковка и автораспаковка для типа Boolean int x = 8; int y = 5; Boolean objB = x > y; // Автораспаковка значения объекта objB: Boolean => boolean if (objB) System.out.println("x > y"); else System.out.println("x < y");
⇑
4.3. Использование в операторах цикла for, while, do-while
В примере показывается использование объекта типа-оболочки Boolean в операторах цикла for, while, do-while. При проверке условия, определяющего выполнение следующей итерации цикла, происходит процесс распаковки значения объекта оболочки типа Boolean в примитивный тип boolean.
import java.util.Scanner; public class TrainAutoPacking { public static void main(String[] args) { // Автоупаковка и автораспаковка для типа Boolean. // Использование в циклах for, while, do-while // 1. Цикл for. Вычисление суммы s = 1 + 2 + ... + 10 int i = 1; Boolean objB = i<=10; int s = 0; // Распаковка значения objB: Boolean => boolean for (; objB; i++) { s += i; // формирование результата условия objB = i<10; } System.out.println("s = " + s); // 2. Цикл while. Вычисление суммы 2 + 4 + 6 + ... + 100 s = 0; i = 0; objB = i<=100; // Автораспаковка objB: Boolean => boolean while (objB) { s += i; i += 2; objB = i<=100; } System.out.println("s = " + s); // 3. Цикл do-while. // Задача. Вычислить сумму чисел, введенных с клавиатуры. // Конец ввода - число 0. Scanner input = new Scanner(System.in); int number; System.out.println("Input numbers:"); s = 0; do { number = input.nextInt(); // ввести число s += number; // увеличить сумму objB = number != 0; // сформировать условие } while (objB); // автоматическая распаковка Boolean => boolean System.out.println("s = " + s); } }
Результат работы программы
s = 55 s = 2550 Input numbers: 5 8 -3 4 0 s = 14
⇑
5. Автоупаковка и автораспаковка значений между типами char и Character
Для типа char также выполняются процессы автоупаковки и автораспаковки.
Пример. В примере демонстрируются процессы взаимной автоупаковки и автораспаковки типов char и Character для операции присваивания (=) и оператора switch.
public class TrainAutoPacking { public static void main(String[] args) { // Автоупаковка и автораспаковка для типов char и Character. // 1. В операторе присваивания Character objC = 'z'; // автоупаковка Character <= char char c = objC; // автораспаковка char <= Character // 2. В операторе switch objC = '+'; // здесь происходит автораспаковка objC в тип char switch (objC) { case '+': System.out.println("Addition"); break; case '-': System.out.println("Substraction"); break; case '*': System.out.println("Multiplication"); break; case '/': System.out.println("Division"); break; default: System.out.println("Undefined operation"); } } }
⇑
Связанные темы
- Автоупаковка и автораспаковка. Общие понятия. Использование при присваивании (=) и в методах. Примеры
- Типы данных. Примитивные типы. Типы-оболочки
⇑