Java Super() конструктор не работает?

Я пытаюсь создать супер-конструктор, но все равно получаю сообщение об ошибке: неявный супер-конструктор Block() не определен. Должен явно вызывать другой конструктор. и кажется, что в основном классе есть 2 конструктора? но я не думаю, что это является причиной ошибки.

Основной класс:

public Block(Material blockMaterialIn, MapColor blockMapColorIn)
{
    this.enableStats = true;
    this.blockSoundType = SoundType.STONE;
    this.blockParticleGravity = 1.0F;
    this.slipperiness = 0.6F;
    this.blockMaterial = blockMaterialIn;
    this.blockMapColor = blockMapColorIn;
    this.blockState = this.createBlockState();
    this.setDefaultState(this.blockState.getBaseState());
    this.fullBlock = this.getDefaultState().isOpaqueCube();
    this.lightOpacity = this.fullBlock ? 255 : 0;
    this.translucent = !blockMaterialIn.blocksLight();
}

public Block(Material materialIn)
{
    this(materialIn, materialIn.getMaterialMapColor());
}

подкласс:

public class ItemVoidiom_Ore extends Block {

public ItemVoidiom_Ore(Material materialIn) {
    super(materialIn);
}

public ItemVoidiom_Ore()  /** the error is here, Implicit super constructor Block() is undefined. Must explicitly invoke another constructor. */
{   setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
    setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}

} Спасибо за любую помощь!

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

public static Block voidiom_ore;

public static void init()
{
    voidiom_ore = new ItemVoidiom_Ore();
}

Редактировать: исправлено, спасибо за помощь!

7 ответов

Решение

Ошибка в том, что нет конструктора Block(), Либо определите конструктор Block() без аргументов или явным вызовом Block(Material blockMaterialIn, MapColor blockMapColorIn) или же Block(Material materialIn) от ItemVoidiom_Ore()

В Java каждый конструктор ДОЛЖЕН вызывать некоторый конструктор суперкласса, вплоть до java.lang.Object, Если вы не добавите super(...) вызовите себя, это будет добавлено для вас автоматически в начале вашего конструктора.

В вашем случае ItemVoidiom_Ore конструктор не содержит никаких super(...)поэтому код ведет себя так, как будто вы написали super() в начале. Тем не менее, класс Block не содержит конструктора без аргументов.

Чтобы решить эту проблему, вы можете добавить конструктор по умолчанию в Blockили добавить super(...) вызвать аргументы для одного из двух вариантов конструктора в Block,

Конструктор класса должен всегда, в качестве первого действия, вызывать один из конструкторов своего суперкласса.

Для вашего первого ItemVoidiom_Ore конструктор, это делается явно:

public ItemVoidiom_Ore(Material materialIn) {
    super(materialIn); // calls Block(Material) constructor
}

Для других ItemVoidiom_Ore конструктор, это не сделано явно, поэтому существует неявный вызов (не существующий) конструктор по умолчанию блока.

Вам либо нужно добавить явный вызов к существующему Block конструктор (как в другом ItemVoidiom_Ore конструктор), или добавьте соответствующий конструктор по умолчанию (без параметров) в Block,

Проблема в том, что второй конструктор public ItemVoidiom_Ore() не вызывает ни один из конструкторов суперкласса.

Вам нужно явно вызвать один из двух конструкторов суперкласса (как вы это делали в первом).

Проблема здесь:

public ItemVoidiom_Ore() {   setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
    setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}

Поскольку вы не упомянули, какой конструктор Block (супер) для использования Java пытается использовать конструктор по умолчанию, но он не существует, поэтому Java не знает, какой конструктор использовать для построения Block, Либо добавьте конструктор по умолчанию в Block или вызвать один из 2 его конструкторов

Пожалуйста, определите конструктор без аргументов для блока.

public Block () {}

Конструктор по умолчанию - это конструктор без параметров.


Когда не делается явный вызов super (конструктор суперкласса) выполняется вызов конструктора по умолчанию суперкласса.

Во втором конструкторе у вас нет явного вызова супер-конструктора, вам нужно изменить код на что-то явно вызывающее конструктор суперкласса:

public ItemVoidiom_Ore() { 
    // Here you need to call super(Material blockMaterialIn, MapColor blockMapColorIn);
    // or super(Material materialIn)
    setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
    setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}

Вам нужно явно вызвать один из существующих конструкторов суперкласса.


Другой альтернативой является добавление конструктора по умолчанию в блок суперкласса.

Другие вопросы по тегам