Java. Автоупаковка и автораспаковка в выражениях и операторе switch

Автоупаковка и автораспаковка в выражениях и операторе switch. Использование автоупаковки и автораспаковки значений для типов boolean и char

 


Содержание


Поиск на других ресурсах:

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");
    }
  }
}

 


Связанные темы