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

 


Споріднені теми