Автоупаковка (autoboxing) и автораспаковка (unboxing) — механизм Java, который автоматически преобразует примитивы в обёртки и обратно: int ↔ Integer, double ↔ Double и т.д. Это часто встречается в коллекциях и при вызовах методов. Важно помнить про null: распаковка Integer, равного null, приводит к исключению. Также стоит понимать, где происходит преобразование: присваивание, передача аргумента, арифметика, сравнения. Пример: Integer a = 10; int b = a + 5;. В уроке — интерактивные задания, примеры и тренировка «как работает код».
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Разметить: упаковка или распаковка
В приведённом фрагменте кода 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
Дополните фрагмент кода, демонстрирующий автоупаковку в 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. Найти место с автораспаковкой null
В данном фрагменте кода 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"); } }}4. Ввести результат выражения с Integer
В данном задании представлен фрагмент кода на 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. Выбрать оператор/метод для сравнения
В данном задании представлен фрагмент кода на 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)");
}
}
}6. Предсказать вывод при смешанных типах
Проанализируйте фрагмент кода на 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);
}
}