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());
}
Вам нужно явно вызвать один из существующих конструкторов суперкласса.
Другой альтернативой является добавление конструктора по умолчанию в блок суперкласса.