2016-06-23 4 views
-1

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

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

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()); 
} 

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

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

public static Block voidiom_ore; 

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

Edit: исправлена, спасибо за помощь!

+2

'ItemVoidiom_Ore()' пытается вызвать 'Block()', который не существует. Вы должны указать, какой конструктор суперкласса выполнить явно. – Eran

+2

'ItemVoidiom_Ore()' неявно начинается с 'super()', что означает, что он пытается использовать конструктор, соответствующий 'Block()'. – khelwood

+0

Я не совсем понимаю Eran .. – itay51998

ответ

2

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

0

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

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

0

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


При отсутствии явного вызова не делается для 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()); 
} 

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


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

0

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

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

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

0

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

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

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

0

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

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

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

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

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

0

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

общественный блок() {}

Смежные вопросы