Java super()构造函数不工作?

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

我试图创建一个超级构造函数,但仍然得到错误:隐式超级构造函数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();
}

编辑:修正了,谢谢你的帮助

错误是没有构造函数
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()不可用