Какие типы данных существуют в Java?

В Java типы данных делятся на две большие категории:

1. Примитивные типы (primitive types)

Это базовые, встроенные типы, которые не являются объектами, а хранятся как значения напрямую (в стеке или в полях).

Тип Размер (бит) Значение по умолчанию Диапазон значений Назначение
byte 8 0 -128 до 127 Маленькие целые числа
--- --- --- --- ---
short 16 0 -32,768 до 32,767 Целые числа (меньше int)
--- --- --- --- ---
int 32 0 ~ -2.1 млрд до 2.1 млрд Стандартный целочисленный тип
--- --- --- --- ---
long 64 0L ±9 квинтильонов Длинные целые числа
--- --- --- --- ---
float 32 0.0f ±3.4×10^38 (с плавающей точкой) Числа с дробной частью
--- --- --- --- ---
double 64 0.0d ±1.8×10^308 Более точные дробные числа
--- --- --- --- ---
char 16 '\u0000' Unicode-символы (от 0 до 65535) Символы
--- --- --- --- ---
boolean 1 (логически) false true или false Булевские значения
--- --- --- --- ---

🔸 Эти типы не наследуются от Object, не имеют методов, и работают быстрее, чем ссылочные типы.

📦 2. Ссылочные типы (reference types)

Это все остальные типы, представляющие объекты. Ссылочные типы хранят в себе указатель на объект в куче.

Примеры:

  • Классы — String, Object, Integer, List, Map, LocalDateTime, и любые пользовательские классы.

  • Интерфейсы — Runnable, Serializable, Comparable, List и т. д.

  • Массивы — int[], String[], User[], т. д.

  • Enums — enum Day { MONDAY, TUESDAY }

  • Записи (Record) — c Java 14+: record Point(int x, int y) {}

  • Аннотации — @Override, @Nullable, и др.

🔹 Все ссылочные типы наследуются от базового класса Object.

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

Java автоматически преобразует примитивные типы в соответствующие объектные (и наоборот):

Примитив Обёртка
int Integer
--- ---
long Long
--- ---
float Float
--- ---
double Double
--- ---
char Character
--- ---
boolean Boolean
--- ---
byte Byte
--- ---
short Short
--- ---
int x = 5;
Integer obj = x; // автоупаковка
int y = obj; // автораспаковка
## **💡 Специфические структуры**
### **1\. null**

Значение, которое может принимать любой ссылочный тип, указывающее на отсутствие объекта.

String s = null;

2. var (с Java 10)

Позволяет компилятору самостоятельно вывести тип:

var name = "Alice"; // String
var list = new ArrayList<Integer>(); // ArrayList<Integer>

⚠️ Это не "динамическая типизация" — переменная имеет фиксированный тип, просто он выведен автоматически.

📌 Итого

Java строго типизирована и поддерживает:

  • 8 примитивных типов — для работы с базовыми значениями (быстро и экономно)

  • Объектные (ссылочные) типы — все остальное, от String до сложных коллекций

  • Автоматическое преобразование между ними (boxing/unboxing)

  • Пользовательские типы через классы, интерфейсы, enum, record

Понимание типов данных — основа эффективной работы с памятью, производительностью и архитектурой в Java.