Ответ
В Java строгая статическая типизация. Все типы данных делятся на две основные категории: примитивные (primitive) и ссылочные (reference).
1. Примитивные типы (8 штук)
Хранятся в стеке (stack memory), хранят непосредственно значение.
| Тип | Размер | Диапазон/Значения | По умолчанию |
|---|---|---|---|
byte |
8 бит | -128 .. 127 | 0 |
short |
16 бит | -32 768 .. 32 767 | 0 |
int |
32 бита | ~ -2.1 млрд .. 2.1 млрд | 0 |
long |
64 бита | огромный (около 9*10^18) | 0L |
float |
32 бита | числа с плавающей точкой | 0.0f |
double |
64 бита | числа с плавающей точкой (двойная точность) | 0.0d |
char |
16 бит | символы Unicode (0..65535) | 'u0000' |
boolean |
~ (JVM-dependent) | true или false |
false |
2. Ссылочные типы
Хранят ссылку (адрес) на объект в куче (heap memory). К ним относятся:
- Объекты классов (например,
String,Integer,ArrayList, ваши собственные классы). - Массивы (например,
int[],String[][]). - Интерфейсы.
- Перечисления (enum).
Ключевые отличия:
- Примитивы работают быстрее и занимают меньше памяти, но не имеют методов.
- Ссылочные типы могут быть
null, имеют методы (через.), участвуют в наследовании. - Для каждого примитива есть класс-обертка (Wrapper Class):
Byte,Short,Integer,Long,Float,Double,Character,Boolean. Автоупаковка (autoboxing) и распаковка (unboxing) позволяют легко конвертировать между ними.
Пример для тестировщика (важность понимания типов):
// Частая ошибка в коде и источник багов
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false! Сравнение ссылок, а не значений.
System.out.println(a.equals(b)); // true. Правильное сравнение.
// Из-за кэширования в Integer от -128 до 127
Integer x = 127;
Integer y = 127;
System.out.println(x == y); // true (особенность реализации)
При написании автотестов на Java нужно четко понимать, когда используется примитив, а когда объект, чтобы корректно писать ассерты (например, assertEquals(10, actualValue) для int и assertEquals(Integer.valueOf(10), actualValue) для Integer).