Примитивные и ссылочные типы
Поймите фундаментальное различие между примитивными и ссылочными типами в Java.
«Примитивные и ссылочные типы» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Примитивные и ссылочные типы
В Java есть две фундаментальные категории типов данных: примитивные типы и ссылочные типы. Понимание различия между ними крайне важно для написания корректного и эффективного кода Java.
Восемь примитивных типов
В Java ровно восемь примитивных типов:
byte(8-битное целое число)short(16-битное целое число)int(32-битное целое число)long(64-битное целое число)float(32-битное число с плавающей точкой)double(64-битное число с плавающей точкой)char(16-битный символ Юникода)boolean(истина или ложь)
Примитивы хранят значение непосредственно в памяти — без дополнительных затрат на объект.
int age = 25;
double price = 19.99;
boolean active = true;
char grade = 'A';
long population = 8_000_000_000L;
System.out.println(age); // 25
System.out.println(price); // 19.99
System.out.println(active); // trueСсылочные типы
Ссылочный тип хранит адрес памяти (ссылку), указывающий на объект в куче. К ним относятся:
- классы (например,
String,Scanner) - массивы (например,
int[]) - интерфейсы
- перечисления и записи
Переменная хранит не сам объект, а указатель на него.
String name = "Alice"; // reference to a String object
int[] scores = {90, 85, 92}; // reference to an array object
// name holds a reference, not the characters directly
System.out.println(name.length()); // 5
System.out.println(scores.length); // 3Память стека и кучи
Переменные примитивных типов хранятся в стеке — быстрой краткоживущей памяти, связанной с вызовами методов.
Объекты ссылочных типов находятся в куче — более крупной долговременной памяти, которой управляет сборщик мусора. Сама ссылка (адрес) хранится в стеке.
// Stack: holds the int value directly
int x = 42;
// Stack: holds reference; Heap: holds the Person object
class Person {
String name;
int age;
}
Person p = new Person(); // p is a reference on stack, object on heap
p.name = "Bob";
p.age = 30;null: отсутствующая ссылка
Ссылочным переменным можно присвоить null, что означает отсутствие объекта, на который они указывают. Примитивам нельзя присвоить null — у них всегда есть значение.
Обращение к ссылке со значением null вызывает NullPointerException (NPE) — одну из самых распространённых ошибок времени выполнения в Java.
String s = null;
// int n = null; // Compile error — primitives can't be null
try {
System.out.println(s.length()); // NullPointerException!
} catch (NullPointerException e) {
System.out.println("Caught NPE: reference was null");
}Семантика копирования: примитивы
При присваивании одной переменной примитивного типа другой Java копирует значение. Изменение одной переменной не влияет на другую — они полностью независимы.
int a = 10;
int b = a; // b gets a copy of the value 10
b = 20; // changing b does NOT affect a
System.out.println(a); // 10
System.out.println(b); // 20Семантика копирования: ссылки
При присваивании одной ссылочной переменной другой обе переменные указывают на один и тот же объект. Изменение объекта через одну ссылку будет видно и через другую.
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2 points to the SAME array
arr2[0] = 99; // modifies the shared array
System.out.println(arr1[0]); // 99 — arr1 sees the change too!
System.out.println(arr2[0]); // 99Классы-обёртки: упаковка примитивов
Для каждого примитивного типа в java.lang есть соответствующий класс-обёртка:
int→Integerdouble→Doubleboolean→Booleanchar→Character
Обёртки позволяют использовать примитивы как объекты — это необходимо для таких коллекций, как List<Integer>.
Integer boxed = Integer.valueOf(42); // explicit boxing
int unboxed = boxed.intValue(); // explicit unboxing
// Autoboxing / auto-unboxing (Java does this automatically)
Integer auto = 100; // autoboxed
int val = auto; // auto-unboxed
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Double.MIN_VALUE); // 5.0E-324Подводные камни автоупаковки
Автоупаковка удобна, но может приводить к трудно заметным ошибкам. Integer кэширует значения от -128 до 127 — за пределами этого диапазона оператор == сравнивает ссылки, а не значения.
Для сравнения объектов-обёрток всегда используйте .equals().
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (cached)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false (different objects!)
System.out.println(c.equals(d)); // true (correct comparison)Передача в методы: передача по значению
В Java всегда используется передача по значению. Для примитивов копируется значение. Для ссылок копируется ссылка (адрес): обе переменные указывают на один объект, но переназначить переменную вызывающего кода из метода нельзя.
static void doubleValue(int n) {
n = n * 2; // only modifies the local copy
}
static void clearArray(int[] arr) {
arr[0] = 0; // modifies the shared object
}
int x = 5;
doubleValue(x);
System.out.println(x); // still 5
int[] nums = {10, 20, 30};
clearArray(nums);
System.out.println(nums[0]); // 0 — object was mutatedПрактическая сводная таблица
Краткое сравнение примитивных и ссылочных типов:
- Хранение: примитив → значение в стеке; ссылка → адрес в стеке и объект в куче
- Значение по умолчанию: примитив → 0/false/\u0000; ссылка → null
- Может иметь значение null: примитив → нет; ссылка → да
- Что копируется при присваивании: примитив → значение; ссылка → адрес
- В коллекциях: для примитивов нужны классы-обёртки
Быстрая проверка
Что произойдёт при выполнении следующего кода?
Integer x = 200; Integer y = 200; System.out.println(x == y);
Итоги: примитивные и ссылочные типы
Главные выводы урока:
- В Java есть 8 примитивных типов, которые хранятся непосредственно в стеке
- Ссылочные типы хранят адрес объекта в куче; переменная содержит этот адрес
- Примитивы копируются по значению, а ссылки — по адресу
- Ссылочные переменные могут иметь значение null, а примитивы — нет
- Классы-обёртки упаковывают примитивы в объекты
- В Java всегда используется передача по значению — даже при передаче ссылок
Часто задаваемые вопросы
Урок «Примитивные и ссылочные типы» бесплатный?
Да — полный текст урока «Примитивные и ссылочные типы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Примитивные и ссылочные типы»?
Поймите фундаментальное различие между примитивными и ссылочными типами в Java. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Примитивные и ссылочные типы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Примитивные и ссылочные типы
- Расширяющие и сужающие преобразования
- Оператор instanceof
- Приведение типов на практике