Автоупаковка/распаковка происходит в выражениях
Вообще автоупаковка и распаковка происходят всякий раз, когда требуется преобразование в объект или из объекта. Это касается выражений. Внутри выражения числовой объект автоматически распаковывается. Выходной результат выражения при необходимости упаковывается заново. Например, рассмотрим следующую программу:
// Автоупаковка/распаковка происходит в выражениях.
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
4
После ++iOb: 101
iOb2 после выражения: 134
i после выражения: 13
Обратите особое внимание на следующую строку программы: ++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 ().