Карта / Синтаксис и типы / Переменные

Переменные

Переменная — это ячейка в памяти, где программа хранит значение под именем.

Зачем она нужна — три вещи:

  • Запомнить значение, чтобы использовать дальше, а не вычислять заново.
  • Обращаться по имени: пишешь age, а не «то число 25».
  • Менять значение со временем — поэтому она и «пере-менная»: сегодня age = 25, завтра age = 26.

Представь кубик: на нём написано имя, внутри лежит значение, а тип говорит, что это за значение. Вот главные типы:

int — целые числа
например: 25, 100, −7
double — дробные числа
например: 3.14, 0.5
String — текст
например: имена, сообщения
boolean — да / нет
например: true / false

Как создать кубик в коде

Сначала пишешь тип, потом имя, потом значение. Строка заканчивается точкой с запятой.

int age = 25;          // создали кубик age со значением 25
age = 26;              // поменяли значение — кубик тот же, число другое

String name = "Артур"; // текст
boolean isDev = true;  // да / нет

Главное на старте:

  • имя придумываешь сам, но понятное: age, а не a;
  • тип менять нельзя: в кубик int не положишь текст;
  • значение менять можно сколько угодно: age = 26;
  • забыл ; в конце — IDE подчеркнёт строку красным. Это не «ты тупой», это подсказка.
Копнуть глубже

Числа можно хранить двумя способами, и это разные вещи:

  • Примитив (int, double, boolean) — это само значение.
  • Обёртка (Integer, Double, Boolean) — это объект вокруг значения.
Примитив intОбёртка Integer
Что этосамо значениеобъект вокруг значения
Где лежитзначение прямо в переменнойобъект в куче, переменная хранит ссылку
Доступнапрямую, быстрочерез ссылку (адрес)
Может быть nullнетда
int x 5 значение прямо внутри
<text x="300" y="16" text-anchor="middle" font-size="13" font-family="monospace" fill="currentColor" opacity="0.55">Integer y</text>
<rect x="240" y="26" width="120" height="104" rx="12" fill="currentColor" fill-opacity="0.04" stroke="currentColor" stroke-opacity="0.5"/>
<text x="300" y="84" text-anchor="middle" font-size="13" fill="currentColor" opacity="0.6">ссылка</text>
<circle cx="300" cy="98" r="5" fill="#16a34a"/>
<text x="300" y="156" text-anchor="middle" font-size="12" fill="currentColor" opacity="0.6">только адрес →</text>

<line x1="362" y1="98" x2="470" y2="98" stroke="#16a34a" stroke-width="2"/>
<polygon points="470,98 459,93 459,103" fill="#16a34a"/>

<text x="520" y="52" text-anchor="middle" font-size="12" fill="currentColor" opacity="0.6">в куче</text>
<rect x="472" y="60" width="96" height="70" rx="10" fill="currentColor" fill-opacity="0.06" stroke="currentColor" stroke-opacity="0.5"/>
<text x="520" y="104" text-anchor="middle" font-size="28" font-weight="600" fill="#16a34a">5</text>

Простыми словами: примитив — это цифра 5 у тебя в руке. Обёртка — коробка в другой комнате (куче), а у тебя только записка с адресом этой комнаты.

Зачем тогда обёртки: коллекции (List<Integer>), null как «значения нет», методы (Integer.parseInt). В остальном бери примитивы — быстрее и дешевле по памяти.

Ещё: var позволяет не писать тип, если он понятен из значения (var name = "Артур";). А область видимости — кубик живёт только внутри своих { }, вышел за скобки, и кубика больше нет.

Под капотом

Память делится на две зоны: стек (быстрый, свой у каждого потока — тут локальные примитивы и ссылки) и heap / куча (общий склад объектов).

1. Передача в метод — всегда по значению.

  • Примитив: уходит копия числа. Поменял внутри метода — оригинал цел.
  • Объект: копируется ссылка. Метод смотрит на тот же объект в куче, но переприсвоить переменную вызывающего не может.

2. Обёртки неизменяемы (immutable). Значение внутри Integer поменять нельзя — можно только создать новый объект и переприсвоить ссылку. «Менять объект через ссылку» — это про изменяемые объекты (твои классы, элементы списка), а не про обёртки.

3. Автобоксинг. Integer i = 5 тихо создаёт объект в куче — в горячем цикле это лишние аллокации и нагрузка на сборщик мусора. Поэтому в перформанс-критичном коде — примитивы.

🎤 Закрыл тему, если можешь объяснить:
• что такое переменная (хранит значение под именем, можно менять);
• чем примитив отличается от обёртки и где каждый лежит (если дошёл до 2-го слоя);
• почему примитив в метод уходит копией, а обёртку нельзя «поменять» (если дошёл до 3-го слоя).