Автоупаковка и автораспаковка

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Автоупаковка (autoboxing) и автораспаковка (unboxing) — механизм Java, который автоматически преобразует примитивы в обёртки и обратно: intInteger, doubleDouble и т.д. Это часто встречается в коллекциях и при вызовах методов. Важно помнить про null: распаковка Integer, равного null, приводит к исключению. Также стоит понимать, где происходит преобразование: присваивание, передача аргумента, арифметика, сравнения. Пример: Integer a = 10; int b = a + 5;. В уроке — интерактивные задания, примеры и тренировка «как работает код».

Список тем

1. Разметить: упаковка или распаковка

id: 40506_ab_01_highlight_parts

В приведённом фрагменте кода Java отметьте, какие из выделенных операций представляют собой автоупаковку (autoboxing), а какие — автораспаковку (unboxing). Автоупаковка — это автоматическое преобразование значения примитивного типа в соответствующий объект класса-обёртки. Автораспаковка — обратное автоматическое преобразование объекта класса-обёртки в значение примитивного типа.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
Integer obj1 = {{100~|~t1}};
int prim1 = {{obj1~|~t2}};
Integer obj2 = {{prim1~|~t3}} + 50;
int prim2 = {{obj2~|~t4}} + {{obj1~|~t5}};
Integer result = calculate({{10~|~t6}}, {{obj2~|~t7}});
Автоупаковка
Автораспаковка
Сообщения
Проверить
Показать подсказку

2. Заполнить сигнатуры: где нужен Integer

id: 40506_ab_02_replace_method_param

Дополните фрагмент кода, демонстрирующий автоупаковку в Java. Заполните пропуски типами данных (int или Integer) так, чтобы код компилировался и выполнялся. Учтите, что метод print должен принимать объектный тип, чтобы можно было продемонстрировать автоупаковку при передаче примитивного типа, а также возможность передачи null. Для переменной a используйте примитивный тип.

Заполните пропуски
public class Main {
    public static void print(input1S value) {
        System.out.println(value);
    }
    
    public static void main(String[] args) {
        input2S a = 100;
        print(a);
        
        input3S b = null;
        print(b);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Найти место с автораспаковкой null

id: 40506_ab_03_error_npe_unboxing

В данном фрагменте кода Java присутствует потенциальная ошибка, связанная с автораспаковкой значения null. При выполнении программы может возникнуть NullPointerException. Вам необходимо найти строку, где происходит автораспаковка null, и исправить её таким образом, чтобы исключение не возникало. Обратите внимание на операции с объектами типа Integer, которые могут содержать null.

Найдите ошибку и исправьте
public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = null;
        Integer c = 5;
        int sum = a + b;
        System.out.println("Sum: " + sum);
        if (c > 0) {
            System.out.println("c is positive");
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Ввести результат выражения с Integer

id: 40506_ab_05_give_result_expression

В данном задании представлен фрагмент кода на Java, демонстрирующий работу автоупаковки и автораспаковки. Внимательно изучите код и определите, какое число будет выведено на экран в результате его выполнения. Введите это число в поле ответа. Обратите внимание на взаимодействие объектов типа Integer и примитивов int в арифметическом выражении.

Что должно получиться?
public class Main {
    public static void main(String[] args) {
        Integer a = 15;
        Integer b = 10;
        int c = 5;
        Integer result = a + b - c;
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

5. Выбрать оператор/метод для сравнения

id: 40506_ab_06_selectfill_compare_ops

В данном задании представлен фрагмент кода на Java, демонстрирующий сравнение объектов типа Integer и примитивов int. В коде имеются пропуски, обозначенные как input1, input2 и т.д. Ваша задача — выбрать из выпадающего списка подходящий оператор или метод сравнения (==, equals(...), compareTo(...) или другие варианты), чтобы код работал корректно с учётом особенностей автоупаковки и автораспаковки. Обратите внимание на контекст каждого сравнения: сравниваются ли ссылки на объекты, значения объектов или происходит смешение типов.

Нужно правильно расставить в пропуски предложенные варианты
public class ComparisonExample {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        Integer c = 200;
        Integer d = 200;
        int e = 100;
        
        // Сравнение 1: два Integer со значением 100 (в кэшируемом диапазоне)
        if (a input1S b) {
            System.out.println("a и b равны (1)");
        }
        
        // Сравнение 2: два Integer со значением 200 (вне кэшируемого диапазона)
        if (c input2S d) {
            System.out.println("c и d равны (2)");
        }
        
        // Сравнение 3: Integer и int
        if (a input3S e) {
            System.out.println("a и e равны (3)");
        }
        
        // Сравнение 4: сравнение значений двух Integer
        if (a input4S b) {
            System.out.println("a и b равны по значению (4)");
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Предсказать вывод при смешанных типах

id: 40506_ab_07_predict_result_mixed

Проанализируйте фрагмент кода на Java, демонстрирующий автоупаковку и автораспаковку при смешанных типах данных. Обратите внимание на преобразования между примитивными типами и их обёртками в арифметических операциях и присваиваниях. Выберите правильный результат выполнения программы из предложенных вариантов.

Выберите правильный вариант ответа
public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Double b = 5.5;
        int c = 20;
        double d = 2.0;
        
        Double result1 = a + b;  // Автораспаковка a и b
        Integer result2 = a / c; // Целочисленное деление
        double result3 = b * d;  // Автораспаковка b
        
        Boolean compare1 = a > b; // Сравнение с автораспаковкой
        boolean compare2 = result2 < result3;
        
        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
        System.out.println(compare1);
        System.out.println(compare2);
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру