Статьи

Полный курс по языку Java — от установки JDK до многопоточности и HTTP-запросов

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

Страница 6 из 30 · 2026-10-25 · 4 мин чтения

Объявление переменных

public class Variables {    public static void main(String[] args) {        int age = 25;        double price = 19.99;        boolean active = true;        char letter = 'A';        String name = "Анна";        age = 26;        System.out.println(name + ", " + age);    }}

Java — язык со статической типизацией: тип переменной задается при объявлении и не меняется.

Примитивные типы

ТипРазмерДиапазонПример
byte8 бит−128…127byte b = 100;
short16 бит−32 768…32 767short s = 1000;
int32 бита≈ ±2,1 млрдint i = 100000;
long64 бита≈ ±9,2·10¹⁸long l = 10000000000L;
float32 бита≈ 7 значащих цифрfloat f = 1.5f;
double64 бита≈ 15 значащих цифрdouble d = 1.5;
char16 битсимвол UTF-16char c = 'x';
boolean—true, falseboolean ok = true;

Целые литералы по умолчанию int, дробные — double. Суффикс L делает литерал long, f — float.

Удобные формы записи литералов:

public class Literals {    public static void main(String[] args) {        int million = 1_000_000;        int hex = 0xFF;        int bin = 0b1010;        int oct = 017;        System.out.println(million + " " + hex + " " + bin + " " + oct);    }}

Вывод: 1000000 255 10 15.

Ссылочные типы

Все, что не примитив — объекты: строки, массивы, коллекции, ваши классы. Переменная хранит ссылку на объект, а не сам объект. Значение null означает отсутствие объекта.

public class References {    public static void main(String[] args) {        String text = "привет";        String empty = null;        System.out.println(text.length());        System.out.println(empty == null);    }}

Вызов метода у null вызовет NullPointerException.

var — вывод типа

С Java 10 для локальных переменных тип можно не писать, компилятор выведет его сам:

public class VarDemo {    public static void main(String[] args) {        var count = 10;        var title = "Курс";        var ratio = 0.75;        System.out.println(count + " " + title + " " + ratio);    }}

var работает только для локальных переменных с инициализатором. Тип остается статическим.

Константы

Ключевое слово final запрещает повторное присваивание:

public class Constants {    static final double PI_APPROX = 3.14159;    static final int MAX_USERS = 100;    public static void main(String[] args) {        final int local = 5;        System.out.println(PI_APPROX * local);    }}

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

Расширение выполняется автоматически, сужение нужно писать явно:

public class Casting {    public static void main(String[] args) {        int i = 10;        double d = i;        double pi = 3.99;        int truncated = (int) pi;        long big = 3_000_000_000L;        int overflow = (int) big;        System.out.println(d);        System.out.println(truncated);        System.out.println(overflow);    }}

Вывод:

10.03-1294967296

При сужении дробная часть отбрасывается, а при выходе за диапазон значение «заворачивается».

Переполнение

public class Overflow {    public static void main(String[] args) {        int max = Integer.MAX_VALUE;        System.out.println(max + 1);        System.out.println(Math.addExact(1, 2));    }}

max + 1 даст -2147483648. Метод Math.addExact бросает исключение при переполнении.

Точность дробных чисел

public class Precision {    public static void main(String[] args) {        System.out.println(0.1 + 0.2);    }}

Результат 0.30000000000000004: double хранит числа в двоичной форме. Для денег используйте BigDecimal.

Классы-обертки

У каждого примитива есть объектный аналог: Integer, Long, Double, Boolean, Character и так далее. Они нужны для коллекций и содержат полезные методы:

public class Wrappers {    public static void main(String[] args) {        int a = Integer.parseInt("123");        double b = Double.parseDouble("3.14");        String s = Integer.toString(255);        String bin = Integer.toBinaryString(10);        int max = Integer.MAX_VALUE;        Integer boxed = 5;        int unboxed = boxed;        System.out.println(a + " " + b + " " + s + " " + bin + " " + max + " " + unboxed);    }}

Автоматическое преобразование между примитивом и оберткой называется автоупаковкой (autoboxing).

Сравнивайте обертки через equals, а не ==:

public class BoxingCompare {    public static void main(String[] args) {        Integer a = 1000;        Integer b = 1000;        System.out.println(a == b);        System.out.println(a.equals(b));    }}

Вывод: false, затем true. Оператор == сравнивает ссылки, а кэш объектов есть только для небольших значений.

Область видимости

Переменная существует внутри блока { }, в котором объявлена:

public class Scope {    public static void main(String[] args) {        int outer = 1;        {            int inner = 2;            System.out.println(outer + inner);        }        System.out.println(outer);    }}

Обращение к inner за пределами блока вызовет ошибку компиляции.