Ответ
Система типов в Java — это набор правил, определяющих, как типы данных объявляются, используются и взаимодействуют друг с другом. Java имеет статическую, строгую, номинативную и безопасную систему типов.
Характеристики системы типов
- Статическая (Static): Проверка типов выполняется во время компиляции. Это позволяет выявлять многие ошибки до запуска программы.
- Строгая (Strong): Не допускает неявных преобразований между несовместимыми типами, что повышает надежность.
- Номинативная (Nominal): Совместимость типов определяется их объявленными именами (иерархией наследования), а не структурой полей и методов.
- Безопасная (Type-safe): Гарантирует, что объект одного типа не может быть трактован как объект другого несовместимого типа (за исключением приведения с проверкой).
Категории типов в Java
// 1. ПРИМИТИВНЫЕ ТИПЫ (хранят значение напрямую)
int count = 10;
boolean flag = true;
double price = 99.95;
// 2. ССЫЛОЧНЫЕ ТИПЫ (хранят ссылку на объект в куче)
// Классы
String name = "Java";
// Интерфейсы
List<String> list = new ArrayList<>();
// Массивы (особый вид ссылочного типа)
int[] numbers = {1, 2, 3};
// 3. ПАРАМЕТРИЗОВАННЫЕ ТИПЫ (Generics) - проверяются на этапе компиляции
Box<Integer> integerBox = new Box<>();
// Box<String> stringBox = integerBox; // Ошибка компиляции: несовместимые типы
Автоупаковка/автораспаковка (Autoboxing/Unboxing)
Механизм автоматического преобразования между примитивными типами и их классами-обертками (wrapper classes).
// Автоупаковка: int -> Integer
Integer boxed = 42; // Эквивалентно: Integer.valueOf(42)
// Автораспаковка: Integer -> int
int unboxed = boxed; // Эквивалентно: boxed.intValue()
// Использование в коллекциях (работают только со ссылочными типами)
List<Integer> list = new ArrayList<>();
list.add(1); // Автоупаковка: int 1 -> Integer
int first = list.get(0); // Автораспаковка: Integer -> int
Преобразование типов (Casting)
- Неявное (Widening): Преобразование в более широкий тип (например,
int->long). Безопасно, выполняется автоматически. - Явное (Narrowing): Преобразование в более узкий тип (например,
double->int). Может привести к потере данных, требует указания в коде:(int) 3.14. - Приведение ссылочных типов: Возможно вверх (upcasting, автоматически) и вниз (downcasting, требует проверки
instanceof).