1. Основы Java 21: Синтаксис, переменные и управляющие конструкции (Дни 1-20)
Основы Java 21: Синтаксис, переменные и управляющие конструкции (Дни 1-20)
Добро пожаловать в интенсив. Первые 20 дней посвящены фундаменту языка Java. Без уверенного владения синтаксисом невозможно ни создание Android-приложений, ни разработка модов для Minecraft на NeoForge. Мы сразу ориентируемся на версию Java 21 (LTS), так как именно она является стандартом для Minecraft 1.21.1 и современной индустрии.
Подготовка рабочего окружения
Для написания кода требуются два компонента:
javac и виртуальную машину JVM.!Процесс превращения кода в работающее приложение
Структура Java-приложения
Java — объектно-ориентированный язык. Любой код должен находиться внутри класса. Рассмотрим минимальную программу:
* public class FirstMod: Объявление класса. Имя файла обязано совпадать с именем публичного класса (FirstMod.java).
* main: Точка входа. С этого метода начинается выполнение любой программы (будь то консольное приложение или серверная часть).
* System.out.println: Команда вывода текста в консоль.
Переменные и типы данных
В Java строгая статическая типизация. Это значит, что вы должны объявить тип переменной до её использования, и этот тип не может измениться.
Примитивные типы данных
В Java существует 8 примитивов, которые хранят значения напрямую в стеке памяти. Для моддинга и геймдева наиболее важны следующие:
| Тип | Размер | Описание | Пример в Minecraft |
| :--- | :--- | :--- | :--- |
| int | 32 бит | Целое число | ID блока, количество предметов в стаке |
| double | 64 бит | Дробное число (высокая точность) | Координаты игрока, здоровье (20.0) |
| float | 32 бит | Дробное число (меньшая точность) | Угол поворота камеры, освещение |
| boolean | 1 бит | Логическое значение (true/false) | isSprinting (бежит ли игрок) |
| char | 16 бит | Один символ Unicode | Символ в чате |
Ссылочные типы и String
Тип String не является примитивом. Это класс, хранящий последовательность символов.
Локальная типизация (var)
Начиная с Java 10, можно использовать ключевое слово var, если компилятор может сам определить тип данных из правой части выражения. Это делает код чище.
> Важно: var работает только внутри методов (локальные переменные). Вы не можете использовать var для полей класса (например, характеристик предмета в моде).
Математические операции в геймдеве
Написание логики игры часто требует формул. Рассмотрим пример расчета урона с критическим ударом.
Где — итоговый урон, — базовый урон оружия, — множитель критического урона (например, 0.5 для 50% бонуса).
В коде это выглядит так:
Основные операторы:
+, -, , / (деление).
* % (остаток от деления). Часто используется для циклической смены текстур или анимаций (например, tick % 20 срабатывает раз в секунду при 20 TPS).
Управляющие конструкции
Логика мода строится на условиях: "Если игрок нажал ПКМ, то...", "Пока здоровье больше 0, то..."
Условный оператор if-else
Switch Expressions (Java 21)
В старых версиях Java switch был громоздким. В Java 21 мы используем улучшенный синтаксис (Switch Expressions), который позволяет возвращать значения и не требует break.
Пример определения редкости предмета:
Это критически важно для NeoForge, где часто приходится перебирать типы блоков или событий.
Циклы
Циклы позволяют повторять код. В Minecraft игровой цикл (Game Loop) обновляет мир 20 раз в секунду.
Цикл for
Используется, когда известно количество повторений. Например, спавн 5 зомби:
Цикл while
Выполняется, пока условие истинно. Опасен возможностью создания бесконечного цикла, что приведет к зависанию игры (крашу).
!Логика проверки условия перед выполнением действия
Массивы (Arrays)
Массив — это контейнер фиксированного размера для хранения данных одного типа. В инвентаре игрока слоты можно представить как массив.
Итоги
int, double, boolean) для производительности и объекты (String) для текста. var упрощает чтение кода локально.switch (Java 14+) значительно сокращает код по сравнению с классическим. Это стандарт для написания обработчиков событий в модах.for для перебора инвентаря или создания групп объектов, и будьте осторожны с while, чтобы не зависнуть в главном потоке игры.