Бесплатно Java general

Лекция 2: ООП в моддинге

Наследование, super, конструкторы, @Override, вложенные классы

ООП в Java на примерах из моддинга. Пригодится, когда начнёте делать свои предметы и блоки.

Наследование (extends)

Один класс может взять все методы и свойства другого:

public class PinkyliteStaffItem extends Item {
    // получает все методы Item: use(), getRarity(), getMaxStackSize()
}

Без extends Item класс не связан с Minecraft и предмет не появится в игре.

В моддинге почти всё строится на наследовании. Свой предмет — extends Item. Свой блок — extends Block. Свой моб — extends Mob.

super

Вызов родительского класса. В конструкторах через super() передают параметры наверх:

public PinkyliteStaffItem(Item.Properties properties) {
    super(properties);  // вызывает конструктор Item
}

Без super(properties) родитель не получит настройки и предмет не будет работать.

Конструкторы

Метод, который запускается при создании объекта. Имя всегда совпадает с классом:

public class PinkyliteStaffItem extends Item {

    public PinkyliteStaffItem(Item.Properties properties) {
        super(properties);  // передаём настройки родителю (Item)
    }
}

В IntelliJ IDEA: встаньте внутри класса → Alt + Insert → Constructor.

@Override

Говорит компилятору: "я переопределяю метод родительского класса":

@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
    // своя логика вместо стандартной
}

Если убрать @Override и ошибиться в имени метода, Java молча создаст новый метод вместо переопределения. С аннотацией компилятор сразу скажет, что такого метода у родителя нет.

Вложенные классы (static class)

Класс внутри другого класса. В моддинге так группируют обработчики клиентских событий:

@Mod(RinovaMod.MOD_ID)
public class RinovaMod {

    // ... основной код мода ...

    @Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
    public static class ClientModEvents {
        @SubscribeEvent
        public static void onClientSetup(FMLClientSetupEvent event) {
        }
    }
}

ClientModEvents живёт внутри RinovaMod, но помечен static, поэтому не зависит от экземпляра мода. Forge находит его по аннотации @EventBusSubscriber и подключает автоматически.