Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
0
Добавлен:
03.12.2019
Размер:
1.21 Mб
Скачать

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

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

Листинг 2.3. Автоупаковка/распаковка внутри выражений

class AutoBox3 {

public static void main(String args[]) {

Integer iOb, iOb2;

int i;

iOb = 100;

System.out.println("Original value of iOb: " + iOb);

// Далее автоматически распаковывается объект iOb,

// выполняется операция инкремента, затем результат

// повторно упаковывается в объект iOb.

++iOb;

System.out.println("After ++iOb: " + iOb);

// Здесь iOb распаковывается, выражение

// вычисляется и результат повторно упаковывается

// и присваивается iOb2.

iOb2 = iOb + (iOb / 3);

System.out.println("iOb2 after expression: " + iOb2);

// To же самое выражение вычисляется, но результат

// повторно не упаковывается.

i = iOb + (iOb / 3);

System.out.println("i after expression: " + i);

}

}

Далее приведен вывод программы, отображающий результаты ее работы.

Original value of iOb: 100

After ++iOb: 101

iOb2 after expression: 134

i after expression: 134

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

++iOb;

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

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

Листинг 2.4. Обработка числовых объектов разных типов в одном выражении

class AutoBox4 {

public static void main(String args[]) {

Integer iOb = 100;

Double dOb = 98.6;

dOb = dOb + iOb;

System.out.println("dOb after expression: " + dOb);

}

}

Далее приведен результат работы программы из листинга 2.4.

iOb after expression: 198.6

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

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

Integer iOb = 2 ;

switch (iOb) {

case 1: System.out.println("one");

break;

case 2: System.out.println("two") ;

break;

default: System.out.println("error") ;

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

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