Перейти к содержимому
Теория · Переменные и типы · урок 1 из 8

Переменные

Чему вы научитесь

Чему вы научитесь:

  • объявлять переменную с типом, класть в неё новое значение и читать его;
  • называть восемь примитивных типов Java и записывать числа вроде 10L и 2.5f;
  • объявлять переменные через var и запрещать их изменение словом final;
  • объяснять, почему поле без значения прочитать можно, а локальную переменную — нельзя.

Представьте коробку с наклейкой. На наклейке написано имя, а внутри лежит значение. По имени коробку можно найти, заглянуть в неё или положить туда что-то другое. Программа хранит данные так же — в переменных, именованных значениях, которые можно прочитать и изменить.

У коробки есть и форма. В коробку для целых чисел не положишь текст, а в коробку для текста — число. Форму коробки в Java называют типом, и его указывают сразу, когда заводят переменную.

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

JAVA
public class Main {
    public static void main(String[] args) {
        age = 30; // ✗
        System.out.println(age);
    }
}
TEXT
error: cannot find symbol

Компилятор не знает имени age: переменную с таким именем никто не объявлял. Сам он её не создаёт, даже когда видит, что в неё что-то кладут.

Объявление переменной

Объявление сообщает компилятору тип и имя новой переменной. Обычно в нём же задают и первое значение:

JAVA
int age = 30;
System.out.println(age);   // 30
System.out.println("age"); // age

Строка int age = 30; читается слева направо:

  • int — тип: целое число;
  • age — имя переменной;
  • = 30 — начальное значение;
  • ; — конец инструкции, как после каждой команды в Java.

Давайте разберём, что печатают две следующие строки:

  1. System.out.println(age) печатает значение переменной — 30.
  2. System.out.println("age") печатает текст в кавычках — слово age.

Разница только в кавычках. Без них Java ищет переменную с таким именем, а с ними печатает сам текст.

Сначала объявить, потом присвоить

Объявить переменную можно и без значения, а положить его позже:

  • int score; заводит коробку для целого числа, пока без значения;
  • score = 10; кладёт в неё 10.

Пока в score ничего не положили, читать её нельзя. Компилятор следит за этим и не пропустит программу, которая читает переменную раньше, чем ей дали значение.

Присваивание и копия значения

Оператор = кладёт в уже объявленную переменную новое значение, а старое пропадает. Такая операция называется присваиванием. Теперь посмотрим, что происходит, когда справа от = стоит другая переменная:

JAVA
int a = 3;
int b = a;
a = 5;
System.out.println(a); // 5
System.out.println(b); // 3

Разберём по строкам:

  1. int a = 3; заводит коробку a и кладёт в неё 3.
  2. int b = a; заводит коробку b и кладёт в неё копию того, что лежит в a, — число 3.
  3. a = 5; меняет только a.
  4. System.out.println(a) печатает 5.
  5. System.out.println(b) печатает 3: в b своя тройка, и за a она не следит.

Строка int b = a не связывает две переменные навсегда. Она один раз копирует значение, и дальше каждая коробка живёт сама по себе. В виджете та же программа и ещё две строки: нажимайте «Следующий шаг» и следите, что лежит в a и b.

ВживуюКопия значенияшаг 1 из 8 · рамок: 1

Программа начинается с main, переменных пока нет.

Следите, что лежит в a и b после каждой строки

Здесь картинка с коробкой неточна. Настоящую вещь из коробки можно только переложить, и коробка опустеет. А int b = a кладёт в b копию, и в a всё остаётся на месте. Чтение тоже ничего не забирает: после System.out.println(a) в a лежит то же число.

Имена переменных

Имя выбирают так, чтобы по нему было понятно, что лежит внутри: age, price, itemCount. Правила такие:

  • имя начинается с буквы и состоит из букв, цифр и знака подчёркивания _;
  • составные имена пишут слитно, каждое следующее слово с заглавной буквы: itemCount, maxSpeed;
  • регистр важен: age и Age — две разные переменные;
  • ключевые слова Java, например int или class, именами быть не могут.

Частая ошибка

Переменную объявили без значения и сразу прочитали:

JAVA
int score;
System.out.println(score); // ✗
TEXT
error: variable score might not have been initialized

Программа не компилируется. Переменная, объявленная внутри main, сама никакого значения не получает, а компилятор проверяет, что перед каждым чтением в неё что-то положили. Дайте значение до чтения, например int score = 0;, и программа напечатает 0.

Главное

  • Переменную объявляют до первого использования: тип, имя и обычно начальное значение — int age = 30;.
  • = кладёт в переменную новое значение, а старое пропадает.
  • int b = a копирует значение один раз, поэтому a = 5 после этого не меняет b.
  • Переменную внутри main нельзя прочитать, пока ей не дали значение, — иначе программа не скомпилируется.