Java super()构造函数不工作?
我试图创建一个超级构造函数,但仍然得到错误:隐式超级构造函数Block()未定义。必须显式调用另一个构造函数。 在主类中似乎有2个构造函数?但我不认为这是导致错误的原因 主要类别:Java super()构造函数不工作?,java,constructor,super,minecraft-forge,Java,Constructor,Super,Minecraft Forge,我试图创建一个超级构造函数,但仍然得到错误:隐式超级构造函数Block()未定义。必须显式调用另一个构造函数。 在主类中似乎有2个构造函数?但我不认为这是导致错误的原因 主要类别: public Block(Material blockMaterialIn, MapColor blockMapColorIn) { this.enableStats = true; this.blockSoundType = SoundType.STONE; this.blockPartic
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();
}
编辑:修正了,谢谢你的帮助 错误是没有构造函数
Block()
。定义一个无参数的构造函数Block()
,或者显式调用Block(Material blockMaterialIn,MapColor blockMapColorIn)
或者Block(Material Material materialIn)
从ItemVoidiom\u Ore()
中调用第二个构造函数公共ItemVoidiom\u Ore()
未调用任何超类的构造函数
您需要显式调用两个超类构造函数中的一个(与第一个一样)。默认构造函数是没有参数的构造函数。
当未显式调用
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());
}
您需要显式调用超类的现有构造函数之一
另一种选择是向超类块添加默认构造函数。在Java中,每个构造函数都必须调用超类的某个构造函数,一直到
Java.lang.Object
。如果您自己没有添加一个super(…)
调用,它将自动添加到构造函数的开头
在您的例子中,ItemVoidiom\u Ore
构造函数不包含任何super(…)
,因此代码的行为就像您在开始时编写了super()
。但是,类块
不包含没有参数的构造函数
要解决此问题,可以将默认构造函数添加到块
,或添加一个超级(…)
调用,为块
中的两个构造函数变量之一提供参数。问题如下:
public ItemVoidiom_Ore() { setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}
由于您没有提到要使用的
Block
(super)的哪个构造函数,Java尝试使用默认构造函数,但它不存在,因此Java不知道要使用哪个构造函数来构建Block
。将默认构造函数添加到块
或调用其2个构造函数之一类构造函数必须始终调用其超类的一个构造函数作为其第一个操作
对于第一个ItemVoidiom\u Ore
构造函数,这是显式完成的:
public ItemVoidiom_Ore(Material materialIn) {
super(materialIn); // calls Block(Material) constructor
}
对于另一个ItemVoidiom\u Ore
构造函数,它不是显式完成的,因此存在对Block的(不存在的)默认构造函数的隐式调用
您需要向现有的
块
构造函数添加显式调用(如在另一个ItemVoidiom\u Ore
构造函数中),或者向块
添加适当的默认(无参数)构造函数。请为块定义无参数构造函数
public Block(){}
ItemVoidiom\u Ore()
尝试调用不存在的Block()
。您必须指定要显式执行的超类构造函数。ItemVoidiom\u Ore()
隐式以super()
开头,这意味着它试图使用与Block()
匹配的构造函数。我不太理解Eran。。问题是编译器只添加了一个默认构造函数(没有参数)当你没有定义另一个的时候。在Block类中,您已经定义了两个构造函数,它们都带有参数,因此必须使用其中一个,因为Block()不可用