Переменные и литералы

Переменная — это именованная ячейка памяти, в которой хранится значение определённого типа. Литерал — это значение, записанное прямо в исходном коде: 42, 3.14, 'A', "Привет", true. Когда вы пишете int x = 42;, x — переменная, а 42 — литерал.

Java — статически типизированный язык: тип переменной задаётся при объявлении и не меняется в течение её жизни. int x всегда будет int, нельзя в ту же переменную положить строку.

С Java 10 появилось ключевое слово var для локального вывода типа: var x = 42; — компилятор сам поймёт, что это int. Но это всё равно статическая типизация — просто тип выводится из инициализатора.

Зачем это нужно

  • Хранить промежуточные результаты вычислений.

  • Делать код выразительным: имя temperatureCelsius понятнее, чем магическое число.

  • Защищать значения от изменения через final.

  • Управлять видимостью и временем жизни данных (локальные, поля, статические).

Пример 1. Объявление и инициализация

public class DeclareInit {
    public static void main(String[] args) {
        int pin;            // объявление
        pin = 13;           // инициализация
        int led = 12;       // объявление + инициализация
        System.out.println("pin = " + pin);
        System.out.println("led = " + led);
    }
}

Вывод:

pin = 13
led = 12

Локальную переменную обязательно нужно инициализировать перед использованием — иначе будет ошибка компиляции «variable might not have been initialized».

Пример 2. Целочисленные литералы

public class IntLiterals {
    public static void main(String[] args) {
        int dec = 255;          // десятичный
        int hex = 0xFF;         // шестнадцатеричный
        int oct = 0377;         // восьмеричный (начинается с 0)
        int bin = 0b1111_1111;  // двоичный (с Java 7)
        long big = 10_000_000_000L; // long требует суффикс L

        System.out.println(dec);
        System.out.println(hex);
        System.out.println(oct);
        System.out.println(bin);
        System.out.println(big);
    }
}

Вывод:

255
255
255
255
10000000000

Подчёркивания внутри числа (1_000_000) — для читаемости, на значение не влияют. Суффикс L обязателен для long, если значение выходит за пределы int.

Пример 3. Вещественные литералы

public class FloatLiterals {
    public static void main(String[] args) {
        double pi = 3.14159;
        double avogadro = 6.022e23;   // 6.022 × 10^23
        float gravity = 9.81f;        // float требует суффикс f
        double small = 1.6e-19;

        System.out.println(pi);
        System.out.println(avogadro);
        System.out.println(gravity);
        System.out.println(small);
    }
}

Вывод:

3.14159
6.022E23
9.81
1.6E-19

По умолчанию вещественный литерал — double. Если нужен float, добавляйте f: 9.81f.

Пример 4. Символьные и строковые литералы

public class CharStringLiterals {
    public static void main(String[] args) {
        char letter = 'A';
        char digit = '7';
        char newline = '\n';
        char unicode = 'A'; // тоже 'A'
        String greeting = "Привет, AlashEd!";
        String escaped = "Строка с \"кавычками\" и \\обратным слешем\\";

        System.out.println(letter);
        System.out.println(digit);
        System.out.print("a");
        System.out.print(newline);
        System.out.println("b");
        System.out.println(unicode);
        System.out.println(greeting);
        System.out.println(escaped);
    }
}

Вывод:

A
7
a
b
A
Привет, AlashEd!
Строка с "кавычками" и \обратным слешем\

char — один Unicode-символ в одинарных кавычках. String — последовательность символов в двойных. Спецсимволы: \n, \t, \", \\, \uXXXX.

Пример 5. Булевы литералы

public class BoolLiterals {
    public static void main(String[] args) {
        boolean obstacleDetected = true;
        boolean motorRunning = false;

        if (obstacleDetected && !motorRunning) {
            System.out.println("Препятствие, но мотор стоит — безопасно.");
        } else {
            System.out.println("Внимание!");
        }
    }
}

Вывод:

Препятствие, но мотор стоит — безопасно.

В Java есть только два булевых литерала: true и false. Никаких 1/0 как в C — это ошибка компиляции.

Пример 6. Константы через final

public class FinalConstants {
    public static final int MOTOR_L_ENB = 6;
    public static final double WHEEL_DIAMETER_CM = 6.5;
    public static final String ROBOT_NAME = "Phobo";

    public static void main(String[] args) {
        System.out.println("Имя робота: " + ROBOT_NAME);
        System.out.println("PWM-пин левого мотора: " + MOTOR_L_ENB);
        System.out.println("Диаметр колеса: " + WHEEL_DIAMETER_CM + " см");
        // MOTOR_L_ENB = 7; // ошибка компиляции: cannot assign a value to final variable
    }
}

Вывод:

Имя робота: Phobo
PWM-пин левого мотора: 6
Диаметр колеса: 6.5 см

final означает «после инициализации больше не меняется». Общепринятое соглашение — имена констант UPPER_SNAKE_CASE.

Пример 7. Локальный вывод типа var

public class VarExample {
    public static void main(String[] args) {
        var count = 10;             // int
        var price = 19.99;          // double
        var name = "Arduino Uno";   // String
        var flag = true;            // boolean

        System.out.println(count + " " + price + " " + name + " " + flag);
    }
}

Вывод:

10 19.99 Arduino Uno true

var работает только для локальных переменных, инициализированных в момент объявления. Тип всё равно фиксируется и проверяется компилятором.

Пример 8. Область видимости

public class Scope {
    static int classField = 100; // поле класса

    public static void main(String[] args) {
        int local = 1;
        {
            int block = 2;
            System.out.println(local + " " + block + " " + classField);
        }
        // System.out.println(block); // ошибка: block недоступна за пределами {}
        System.out.println(local);
    }
}

Вывод:

1 2 100
1

Переменная видна только в том блоке { }, в котором объявлена. Поля класса (classField) видны во всех методах класса.

Подводные камни

Предупреждение

  • Имена переменных: должны начинаться с буквы, $ или _ (но не с цифры). Camel-case: ledPin, motorSpeedPercent.

  • Зарезервированные слова: class, int, new, return, static, final и др. нельзя использовать как имена переменных.

  • int переполняется молча: int x = 2_000_000_000 + 2_000_000_000; даст отрицательное число, без ошибок.

  • float точность ~7 знаков: для денег используйте BigDecimal, не double/float.

  • Литерал по умолчанию: 3.14 — это double. Присвоение float f = 3.14; не скомпилируется — нужно 3.14f или явное приведение.

  • ``long`` без ``L``: long big = 10000000000; — ошибка, литерал интерпретируется как int и переполняется ещё до присваивания.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Oracle Java Tutorials (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.