0Pricing
Java Academy · Урок

Примитивные и ссылочные типы

Поймите фундаментальное различие между примитивными и ссылочными типами в 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 → Integer
  • double → Double
  • boolean → Boolean
  • char → 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 — локальная установка не требуется.

Все уроки этого курса

  1. Примитивные и ссылочные типы
  2. Расширяющие и сужающие преобразования
  3. Оператор instanceof
  4. Приведение типов на практике
← Назад к Java Academy