Переменные и типы данных в Java — бесплатный урок

Переменные и типы данных в Java

Бесплатный открытый урок: восемь примитивных типов Java, строки, константы, целочисленное деление, переполнение и погрешность дробных чисел. Все примеры проверены на JDK 21.

Переменная — это имя, тип и значение

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

public class Peremennye {
    public static void main(String[] args) {
        int vozrast = 30;
        long naselenie = 8_100_000_000L;
        double ves = 72.5;
        boolean student = true;
        char bukva = 'A';
        String imya = "Анна";

        System.out.println(imya + ", возраст " + vozrast);
        System.out.println("Население: " + naselenie);
        System.out.println("Вес: " + ves);
        System.out.println("Студент: " + student);
        System.out.println("Буква: " + bukva);
    }
}
Анна, возраст 30
Население: 8100000000
Вес: 72.5
Студент: true
Буква: A

Подчёркивания в числе 8_100_000_000L компилятор игнорирует — они нужны только человеку. Суффикс L обязателен: без него литерал считается int и не помещается в диапазон.

Какие типы бывают

  • Целые: byte (−128…127), short, int (примерно ±2,1 млрд), long. По умолчанию берите int, а для денег в копейках, идентификаторов и времени в миллисекундах — long.
  • Дробные: float и double. По умолчанию — double.
  • Логический: boolean со значениями true и false. Числа вместо них не подходят: в Java 1 не равно true.
  • Символ: char в одинарных кавычках: 'A'.
  • Строка: String в двойных кавычках. Это не примитив, а объект, и сравнивать строки нужно методом equals, а не оператором ==.

Имена переменных пишут в стиле camelCase со строчной буквы: vozrastKlienta, а не VozrastKlienta и не vozrast_klienta. Компилятору всё равно, но так пишут все, и чужой код станет читаться привычно.

Деление целых чисел и остаток

Самая частая ошибка новичка в арифметике: если оба операнда целые, деление тоже целое, дробная часть отбрасывается ещё до присваивания.

public class Delenie {
    public static void main(String[] args) {
        int a = 7;
        int b = 2;

        System.out.println(a / b);
        System.out.println(a % b);
        System.out.println(a / (double) b);

        int maksimum = Integer.MAX_VALUE;
        System.out.println(maksimum);
        System.out.println(maksimum + 1);

        System.out.println(0.1 + 0.2);
    }
}
3
1
3.5
2147483647
-2147483648
0.30000000000000004
  • 7 / 2 даёт 3, а не 3.5: чтобы получить дробь, хотя бы один операнд должен быть дробным — этим и занимается (double) b.
  • % — остаток от деления, им удобно проверять чётность: x % 2 == 0.
  • Переполнение int не считается ошибкой: значение молча «переворачивается» в минус. Для больших чисел берите long.
  • 0.1 + 0.2 не равно 0.3: double хранит числа в двоичной дроби. Деньги в double не считают — используют целые копейки или BigDecimal.

Приведение типов и форматирование

Расширяющее преобразование (intdouble) Java делает сама. Сужающее — только явным приведением, и оно отбрасывает дробную часть, а не округляет. Для округления есть Math.round.

import java.util.Locale;

public class Tochnost {
    public static void main(String[] args) {
        double cena = 1234.5678;

        System.out.println((int) cena);
        System.out.println(Math.round(cena));
        System.out.printf(Locale.ROOT, "%.2f%n", cena);
        System.out.printf(Locale.forLanguageTag("ru"), "%.2f%n", cena);
    }
}
1234
1235
1234.57
1234,57

Обратите внимание на две последние строки: разделитель дробной части зависит от локали. Если её не задать явно, один и тот же код напечатает 1234.57 на сервере и 1234,57 на домашнем компьютере с русскими настройками. В уроке локаль указана явно, поэтому результат одинаков везде.

Константы

Слово final запрещает менять значение после инициализации. Такой код не компилируется:

final double stavka = 0.13;
stavka = 0.15;

Компилятор ответит cannot assign a value to final variable stavka. Не компилируется и попытка молча потерять точность:

int kolichestvo = 3.5;

Здесь будет incompatible types: possible lossy conversion from double to int. Java требует, чтобы потеря данных была написана явно: (int) 3.5.

Задание для самопроверки

  1. Посчитайте, сколько полных часов и сколько оставшихся минут в 500 минутах. Используйте / и %.
  2. Переведите 25 °C в градусы Фаренгейта по формуле F = C * 9 / 5 + 32. Сравните результат при целых и при дробных операндах.
  3. Объявите final int GOD = 2026; и попробуйте изменить значение. Прочитайте сообщение компилятора.

Что дальше

Предыдущий урок — первая программа на Java, следующий — ветвления: if, else и switch. Все бесплатные занятия собраны в разделе «Уроки Java».