Переменные
Переменная — это ячейка в памяти, где программа хранит значение под именем.
Зачем она нужна — три вещи:
- Запомнить значение, чтобы использовать дальше, а не вычислять заново.
- Обращаться по имени: пишешь
age, а не «то число 25». - Менять значение со временем — поэтому она и «пере-менная»: сегодня
age = 25, завтраage = 26.
Представь кубик: на нём написано имя, внутри лежит значение, а тип говорит, что это за значение. Вот главные типы:
int — целые числаdouble — дробные числаString — текстboolean — да / нетКак создать кубик в коде
Сначала пишешь тип, потом имя, потом значение. Строка заканчивается точкой с запятой.
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 | нет | да |
<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-го слоя).