Автоупаковка/распаковка происходит в выражениях


Вообще автоупаковка и распаковка происходят всякий раз, когда требуется преобразование в объект или из объекта. Это касается выражений. Внутри выражения числовой объект автоматически распаковывается. Выходной результат выражения при необходимости упаковывается заново. Например, рассмотрим следующую программу:

// Автоупаковка/распаковка происходит в выражениях.
class AutoBox3 {
public static void main(String args[]) {
Integer iOb, iOb2; int i;
iOb = 100;
System.out.println("Исходное значение iOb: " + iOb) ;
// Следующее автоматически распаковывает iOb,
// выполняет его приращение, затем повторно
// упаковывает результат обратно в iOb.
++iOb; System.out.println("После ++iOb: " + iOb) ;
// Здесь iOb распаковано, выражение вычисляется,
//а результат снова упаковывается и
// присваивается iOb2.
iOb2 = iOb + (iOb / 3) ;
System.out.println("iOb2 после выражения: " + iOb2);
// Вычисляется то же самое выражение,
// но результат не упаковывается,
i = iOb + (iOb / 3);
System.out.println ("i после выражения: " + i) ;
}
}

Вывод показан ниже:

Исходное значение iOb: 100
После ++iOb: 101
iOb2 после выражения: 134
i после выражения: 13
4

Обратите особое внимание на следующую строку программы: ++iOb;

Это вызывает увеличение на 1 значения iOb. Оно работает следующим образом: iOb распаковывается, значение увеличивается и результат упаковывается вновь.

Автоматическая распаковка также позволяет смешивать разные типы числовых объектов в одном выражении. Как только значение распаковано, применяются стандартные правила повышения типов и преобразования. Например, следующая программа абсолютно корректна:

class AutoBox4 {
public static void main(String args[]) {
Integer iOb = 100;
Double dOb =98.6;
dOb = dOb + iOb;
System.out.println("dOb после выражения: " + dOb) ;
}
}

Результат показан ниже:

dOb после выражения: 198.6

Как видите, оба объекта — и Double dOb, и Integer iOb — участвуют в сложении, и результат повторно упаковывается и сохраняется в dOb.

Благодаря автоупаковке, можно применять целочисленные объекты для управления оператором switch. Например, рассмотрим следующий фрагмент кода:

Integer iOb = 2; switch(iOb) {
case 1: System.out.println("один");
break;
case 2: System.out.println("два");
break;
default: System.out.println("ошибка");
}

Когда вычисляется выражение switch, iOb распаковывается и получается его значение типа int.

Как показывают примеры программ, благодаря автоупаковке/распаковке, применение числовых объектов в выражениях интуитивно понятно и просто. В прошлом такой код требовал применения приведений и вызовов методов вроде intValue ().