Глиф Учебники

Урок 2. Переменные и типы данных

Курс «Java» · урок 2 из 10 · 4 минуты чтения

Переменная — именованное место в памяти, где программа хранит значение: число, букву, строку. В Java у каждой переменной есть тип, и он не меняется: в переменную для целых чисел нельзя положить текст. Компилятор проверяет типы ещё до запуска, поэтому многие ошибки видны сразу.

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

Переменную объявляют так: тип, имя, знак = и начальное значение.

Java
public class Main {
    public static void main(String[] args) {
        int age = 16;
        double height = 1.75;
        char grade = 'A';
        boolean isStudent = true;
        String name = "Анна";

        System.out.println(name);
        System.out.println(age);
        System.out.println(height);
        System.out.println(grade);
        System.out.println(isStudent);
    }
}
Вывод
Анна
16
1.75
A
true

Значение можно поменять позже — уже без указания типа: age = 17;. Объявить переменную с тем же именем второй раз в том же методе нельзя.

Имена переменных пишут латиницей, в стиле camelCase: первое слово с маленькой буквы, следующие — с большой (studentName, totalPrice). Имя не может начинаться с цифры и совпадать со служебным словом (class, int).

Основные типы

ТипЧто хранитПример
intцелое число от −2 147 483 648 до 2 147 483 647int count = 42;
longцелое число до ±9,2·10¹⁸long big = 3_000_000_000L;
doubleдробное число, около 15–16 верных знаковdouble price = 9.99;
floatдробное число поменьше, около 7 знаковfloat f = 2.5f;
charодин символ, в одинарных кавычкахchar c = 'Я';
booleantrue (истина) или false (ложь)boolean ok = false;
byte, shortмаленькие целые числаbyte b = 100;
Stringстрока, в двойных кавычкахString s = "текст";

Первые восемь типов называются примитивными: они хранят само значение. String — не примитивный тип, а класс; строкам посвящён отдельный урок.

примитивные типы — значение внутри int age 16 double height 1.75 char grade 'A' boolean isStudent true класс String — внутри ссылка на объект String name ссылка объект String "Анна" тип не меняется age = 17; можно age = "текст"; ошибка компилятор проверяет до запуска
Примитивные переменные age, height, grade и isStudent хранят само значение, а name типа String — ссылку на объект-строку; тип переменной не меняется, поэтому строку в int компилятор не пропустит.

Обратите внимание на запись чисел:

Для обычных целых чисел берите int, для больших — long, для дробных — double.

Арифметика

Java
public class Main {
    public static void main(String[] args) {
        int a = 17;
        int b = 5;
        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / b);
        System.out.println(a % b);
        System.out.println((double) a / b);
    }
}
Вывод
22
12
85
3
2
3.4

Главное, что здесь нужно запомнить:

делим a = 17 на b = 5 17 / 5 = 3 три полные пятёрки, дробь отброшена 17 % 5 = 2 остаток a / b int / int → int 3 (double) a / b double / int → double 3.4
17 / 5 даёт 3 — столько полных пятёрок, дробная часть отбрасывается, а 17 % 5 = 2 — остаток; если одно из чисел дробное, как в (double) a / b, результат 3.4.

Есть короткие записи для изменения переменной:

Java
public class Main {
    public static void main(String[] args) {
        int count = 10;
        count++;
        count += 5;
        count--;
        count *= 2;
        System.out.println(count);
    }
}
Вывод
30

count++ прибавляет единицу (11), count += 5 — пять (16), count-- вычитает единицу (15), count *= 2 умножает на два (30).

Строки и числа вместе

Знак + со строкой не складывает, а склеивает. Выражение читается слева направо, и как только встретилась строка, дальше всё склеивается:

Java
public class Main {
    public static void main(String[] args) {
        int x = 2;
        int y = 3;
        System.out.println("Сумма: " + x + y);
        System.out.println("Сумма: " + (x + y));
        System.out.println(x + y + " — сумма");
    }
}
Вывод
Сумма: 23
Сумма: 5
5 — сумма

В первой строке к тексту приклеилась двойка, потом тройка. Скобки заставляют сначала сложить числа.

выражение, x = 2, y = 3 после первого шага итог "Сумма: " + x + y "Сумма: 2" + 3 "Сумма: 23" "Сумма: " + (x + y) "Сумма: " + 5 "Сумма: 5" x + y + " — сумма" 5 + " — сумма" "5 — сумма" считается первым строка число строка + число → строка
Выражение читается слева направо: к строке «Сумма: » приклеивается 2, затем 3 — выходит «Сумма: 23», а x + y в скобках или в начале выражения сначала складываются в 5.

Приведение типов

Из «меньшего» типа в «больший» значение переходит само: double d = 7; даёт 7.0. Обратно — только явно, с указанием типа в скобках, потому что часть значения может потеряться:

Java
public class Main {
    public static void main(String[] args) {
        double price = 9.99;
        int whole = (int) price;
        System.out.println(whole);
        char letter = 'A';
        System.out.println(letter + 1);
        System.out.println((char) (letter + 1));
    }
}
Вывод
9
66
B

(int) отбрасывает дробную часть, а не округляет: из 9.99 получается 9. Символ — это число (его код), поэтому 'A' + 1 даёт 66, а приведение к char превращает код обратно в символ. Если написать int whole = price; без приведения, компилятор остановится с ошибкой incompatible types: possible lossy conversion from double to int.

Переполнение и неточность

У каждого типа свой предел. Если перейти его, значение «перескакивает» на другой конец диапазона — без всякой ошибки:

Java
public class Main {
    public static void main(String[] args) {
        int big = 2147483647;
        big = big + 1;
        System.out.println(big);
        long ok = 2147483647L + 1;
        System.out.println(ok);
        System.out.println(0.1 + 0.2);
    }
}
Вывод
-2147483648
2147483648
0.30000000000000004

Дробные числа хранятся в двоичном виде и не всегда точно: 0.1 + 0.2 чуть больше 0.3. Поэтому дробные числа не сравнивают через ==, а для денег используют целые копейки или класс BigDecimal.

Константы и var

Слово final запрещает менять переменную после первого значения — так объявляют константы. Их имена принято писать большими буквами:

Java
final int DAYS_IN_WEEK = 7;

С Java 10 вместо типа локальной переменной можно написать var — компилятор выведет тип из значения: var count = 5; — это int, var name = "Анна"; — String. Тип всё равно есть и не меняется, var лишь сокращает запись.

Частые ошибки

Коротко

Проверьте себя

1. Что выведет System.out.println(7 / 2);?
2. Какой тип подойдёт для числа 5 000 000 000?
3. Что выведет System.out.println("Итог: " + 1 + 2);?
4. Чему равно (int) 4.8?