JavaRush /Курсы /JAVA 25 SELF /Автовыведение типа, константы в Java

Автовыведение типа, константы в Java

JAVA 25 SELF
10 уровень , 2 лекция
Открыта

1. Ключевое слово var

Когда мы только начинаем писать код на Java, нас встречает строгая система типов: каждую переменную нужно явно объявлять — указать её тип. Это полезно для надёжности, но иногда записи становятся громоздкими и перегружают код. Чтобы сделать жизнь проще, в Java добавили удобный инструмент — автовыведение типа (var).

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

Пример

var age = 23;            // компилятор определит тип числа 23 и подставит  int age
var name = "Анна";       // компилятор определит тип "Анна" и подставит String name
var price = 99.99;       // компилятор определит тип 99.99 и подставит  double price

Почему появился var?

  • Читабельность: не нужно писать длинные типы (вроде HashMap<String, List<Integer>>) вручную.
  • Гибкость: позволяет легче менять типы в будущем: исправили справа — слева var уже подстроится.
  • Современный стиль: практически все современные Java‑проекты используют var там, где тип легко читается из инициализации.

Когда можно (и нужно) использовать var

  • Когда справа однозначно видно, какой тип у переменной.
  • Когда тип очевиден (var price = 100; — ясно, что это int).
  • Когда тип слишком длинный или сложный (например, HashMap<Integer, List<Calendar>>).

Пример с массивом

var numbers = new int[] { 1, 2, 3, 4 };

Пример с методом

var input = console.nextLine(); // input — это String (метод возвращает String)

Когда лучше НЕ использовать var

Если тип неочевиден по правой части, код может стать менее понятным. Если через месяц вы сами не поймёте, что там за тип, лучше явно указать.

var mystery = DoSomethingVeryComplicated(); // КТО ТЫ, mystery???

Здесь лучше явно указать тип:

String result = DoSomethingVeryComplicated();

Золотое правило: используйте var только там, где он не ухудшает читаемость!

var — только для локальных переменных

Ключевое слово var работает только для локальных переменных — внутри методов. Нельзя использовать var для:

  • параметров метода;
  • полей класса;
  • констант.

Как работает var "под капотом"

  • Компилятор Java при компиляции подставляет правильный тип.
  • После компиляции никакого var не остаётся.
  • Нет потери производительности: это удобство только для программиста.
var year = 2025; // на этапе компиляции становится: int year = 2025;

Типичные ошибки при использовании var

Неинициализированная переменная:

var a; // ОШИБКА: Компилятору не из чего вывести тип!

Неоднозначная инициализация:

var list = null; // ОШИБКА: Тип null не определён!

Переиспользование переменной с разными типами:

var value = 5;     // value — int
value = "Пять";    // ОШИБКА: value уже int!

Сравнение: явные типы и var

Сценарий Явный тип var
Тип однозначен
int age = 42;
var age = 42;
Метод возвращает сложный тип
HashMap<Integer, String> dict = SomeFunc();
var dict = SomeFunc();
Массив
String[] names = ...
var names = ...
Совет
В большинстве случаев в современных проектах используется var для локальных переменных. Для параметров, полей, констант — только явные типы.

2. Ключевое слово final: объявление констант

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

  • Число Пи (PI = 3.14159…)
  • Максимальное количество пользователей (MAX_USERS = 1000)
  • Название компании (COMPANY_NAME = "JavaRush")

В Java для объявления константы используется модификатор final. Он говорит компилятору: «после первого присваивания — больше менять нельзя!»


final Тип ИМЯ_КОНСТАНТЫ = значение;
Синтаксис объявления константы в Java

Синтаксис

final int DAYS_IN_WEEK = 7;
final double PI = 3.1415926535;
final String GREETING = "Привет, Java!";

Важные моменты:

  • Переменная с final должна быть инициализирована (сразу или в конструкторе — если это поле класса).
  • Попытка изменить значение приведёт к ошибке компиляции.

Пример: нельзя изменить final переменную

final int MAX_USERS = 100;
MAX_USERS = 200; // Ошибка: нельзя присвоить новое значение final переменной

Комментарий: если раскомментировать присваивание — проект не соберётся.

3. static final: константы на уровне класса

В Java часто нужны константы, не зависящие от конкретного объекта, — «общие» для всего класса. Для этого используют связку static + final.

Почему static final?

  • static — переменная принадлежит классу (одна на всех).
  • final — значение нельзя изменить.

Синтаксис

public static final double PI = 3.1415926535;
public static final int MAX_USERS = 1000;
public static final String COMPANY_NAME = "JavaRush";

Где объявлять? Обычно — в начале класса (до методов).

Пример использования в классе

public class MathUtils 
{
    public static final double PI = 3.1415926535;

    public static double circleLength(double radius) 
    {
        return 2 * PI * radius;
    }
}

Вызов:

double len = MathUtils.circleLength(5);
System.out.println(len); // 31.4159...

Обратите внимание: к константе обращаемся через имя класса: MathUtils.PI.

4. Отличие между просто final и static final

final — значение поля нельзя изменить после инициализации, но у каждого объекта своё значение.

static final — одна константа на весь класс, не зависит от объектов.

Пример: разница на практике

public class User 
{
    public final String name;                      // У каждого User своё имя (final)
    public static final String COMPANY = "JavaRush"; // Одна компания на всех (static final)

    public User(String name) 
    {
        this.name = name;
    }
}
User u1 = new User("Вася");
User u2 = new User("Петя");

System.out.println(u1.name);      // Вася
System.out.println(u2.name);      // Петя
System.out.println(User.COMPANY); // JavaRush

Вывод: name — индивидуальное неизменяемое поле, COMPANY — общая константа.

Соглашения по именованию констант

Константы принято называть ЗАГЛАВНЫМИ_БУКВАМИ_С_ПОДЧЁРКИВАНИЕМ.

public static final int MAX_USERS = 1000;
public static final double GRAVITY = 9.81;
public static final String DEFAULT_GREETING = "Hello, world!";

Совет: увидели подобное имя — не пытайтесь менять значение в коде: компилятор не позволит.

5. Практика: объявление и использование констант

Пример: класс с константами

public class CircleCalculator 
{
    public static final double PI = 3.1415926535;

    public static double getLength(double radius) 
    {
        return 2 * PI * radius;
    }

    public static double getArea(double radius) 
    {
        return PI * radius * radius;
    }
}

Использование:

public class Main 
{
    public static void main(String[] args) 
    {
        double r = 5.0;
        System.out.println("Длина окружности: " + CircleCalculator.getLength(r));
        System.out.println("Площадь круга: " + CircleCalculator.getArea(r));
    }
}

Результат:

Длина окружности: 31.415926535
Площадь круга: 78.5398163375

Попытка изменить константу

CircleCalculator.PI = 3.14; // Ошибка компиляции: cannot assign a value to final variable PI

6. Особенности и нюансы

Константы для объектов

Можно объявлять final для ссылок на объекты, но это не делает объект неизменяемым! Это лишь запрещает присваивать переменной другую ссылку.

final StringBuilder sb = new StringBuilder("Hello");
sb = new StringBuilder("World"); // Ошибка: нельзя присвоить новый объект
sb.append(", Java!");            // Разрешено — меняется состояние объекта
System.out.println(sb);          // Hello, Java!

Вывод: final защищает ссылку, а не объект. Для настоящей неизменяемости используйте неизменяемые классы (например, String, List.of() и т. п.).

Использование констант против «магических чисел»

Плохой стиль:

double area = 3.1415 * r * r; // Что за 3.1415? Почему именно это число?

Хороший стиль:

double area = PI * r * r; // Сразу понятно, что используется число Пи

7. Типичные ошибки при работе с константами и var

Ошибка №1: попытка изменить значение final переменной. Если переменная объявлена с final, повторное присваивание приведёт к ошибке компиляции.

Ошибка №2: попытка объявить константу через var. Для констант всегда используйте явный тип вместе с final или static final. var — только для локальных переменных.

Ошибка №3: неправильное именование констант. Константы должны быть ЗАГЛАВНЫМИ_БУКВАМИ_С_ПОДЧЁРКИВАНИЕМ. Запись вроде final int maxUsers = 100; ухудшает читаемость.

Ошибка №4: забыли про область видимости. Константа, объявленная внутри метода, видна только в нём. Для использования по всему классу объявляйте на уровне класса как static final.

Ошибка №5: считать, что final делает объект неизменяемым. final фиксирует ссылку, а не состояние объекта — это разные вещи.

1
Задача
JAVA 25 SELF, 10 уровень, 2 лекция
Недоступна
Быстрое объявление приветствия 👋
Быстрое объявление приветствия 👋
1
Задача
JAVA 25 SELF, 10 уровень, 2 лекция
Недоступна
Неизменное число дней в неделе 📅
Неизменное число дней в неделе 📅
1
Задача
JAVA 25 SELF, 10 уровень, 2 лекция
Недоступна
Математические константы для всего мира 🌍
Математические константы для всего мира 🌍
1
Задача
JAVA 25 SELF, 10 уровень, 2 лекция
Недоступна
Установка максимального лимита игроков 🚫
Установка максимального лимита игроков 🚫
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Popka Уровень 24
25 декабря 2025
На будущее сразу скажу (потому что, что в старых лекциях, что в этих - это не так явно выражено) final это не просто инструмент для констант типа числа пи. Просто многие могут ошибочно полагать: "а зачем мне этот файнал сейчас, если я не особо планирую какие-то названия общие делать или числа пи использовать". Прикол в том, что вы будете использовать final ооочень часто. Наравне с модификатором private. Почти в каждом вашем классе инициализация объектов будет происходит с использованием private final. Т.е. final это не что-то редкое и исключительное, final - это норма для полей класса.
C0N5P1RACY Уровень 1
16 ноября 2025
Ничего плохого сказать не хочу, но мне как то тяжело даются классы, в третьей задаче мой код в IDEA не запускался, но почему то тестирование задачи я прошел, для меня классы это темный лес, хотя они все чаще появляются в задачах, но что я делаю я не понимаю, надеюсь что в следующих лекциях эта тема будет освещена подробнее
30 ноября 2025
По итогу осветили в дальнейшем?
C0N5P1RACY Уровень 1
1 декабря 2025
Пока дохожу до них в классическом курсе, уже почти на тех темах с которых ушел в новом курсе, хочу сказать что многие темы там раскрываются куда подробнее Но классы для меня пока вообще не понятны, точнее все эти public static и тд
Олег Сычев Уровень 15
14 февраля 2026
Классы вам прям надо изучить, ибо это основа всего программирования на Java. Когда будете делать веб приложение, у вас будет огромное количество классов. На самом деле - не только веб приложение, но и любое приложение на Java.
Ksanders Уровень 32
9 октября 2025
Задачи этой лекции вообще без изюминки, слишком простые В последней задаче непонятно зачем нужен комментарий:

// Выводим значение константы на экран
Программа же все равно выдаст ошибку при компиляции. В условиях задачи нет требования выводить значение константы на экран,
Dthmth Уровень 11
25 октября 2025
к текущему уровню вообще пока ни одной задачи "с изюминкой", даже если комментарии-подсказки удалять
Xaxatumba Уровень 38
6 ноября 2025
Хочешь изюминку добавь в выводе какой тип подставил компилятор вместо var.