Java super() 构造函数不工作?
Java super() constructor not working?
我正在尝试创建一个超级构造函数,但我仍然收到错误消息:隐式超级构造函数 Block() 未定义。必须显式调用另一个构造函数。
似乎在主要 class 中有 2 个构造函数?但我不认为这是导致错误的原因。
主要class:
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());
}
子 class:
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());
}
}
感谢您的帮助!
编辑:我在此处以不同的方式定义了对象 class
public static Block voidiom_ore;
public static void init()
{
voidiom_ore = new ItemVoidiom_Ore();
}
编辑:已修复,感谢您的帮助!
错误是没有构造函数Block()
。要么用无参数定义构造函数 Block()
,要么从 ItemVoidiom_Ore()
显式调用 Block(Material blockMaterialIn, MapColor blockMapColorIn)
或 Block(Material materialIn)
问题是第二个构造函数 public ItemVoidiom_Ore()
没有调用超类的任何构造函数。
您需要显式调用两个超类构造函数中的一个(就像您在第一个构造函数中所做的那样)。
默认构造函数是不带参数的构造函数。
当没有显式调用 super
(super class 的构造函数)时,将调用 super class 的默认构造函数。
在你的第二个构造函数中,你没有显式调用超级构造函数,你需要将代码更改为显式调用超级构造函数的代码 class:
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());
}
您需要显式调用超类的现有构造函数之一 class。
另一种方法是向超级 class 块添加默认构造函数。
在 Java 中,每个构造函数必须调用超级 class 的某个构造函数,一直到 java.lang.Object
。如果您自己不添加 super(...)
调用,则会在构造函数的开头自动添加。
在您的例子中,ItemVoidiom_Ore
构造函数不包含任何 super(...)
,因此代码的行为就好像您在开头写了 super()
。但是,class Block
不包含无参数的构造函数。
要解决此问题,您可以将默认构造函数添加到 Block
,或添加一个 super(...)
调用,为 Block
中的两个构造函数变体之一提供参数。
问题出在这里:
public ItemVoidiom_Ore() { setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}
因为你没有提到Block
(超级)使用哪个构造函数Java尝试使用默认构造函数但它不存在所以Java不'不知道使用哪个构造函数来构建 Block
。将默认构造函数添加到 Block
或调用其 2 个构造函数之一
class 构造函数必须始终作为其第一个操作调用其超级class' 构造函数之一。
对于您的第一个 ItemVoidiom_Ore
构造函数,这是明确完成的:
public ItemVoidiom_Ore(Material materialIn) {
super(materialIn); // calls Block(Material) constructor
}
对于您的其他 ItemVoidiom_Ore
构造函数,它没有显式完成,因此有一个对 Block 的(不存在的)默认构造函数的隐式调用。
您需要添加对现有 Block
构造函数的显式调用(如在其他 ItemVoidiom_Ore
构造函数中),或者向 [=13= 添加适当的默认(无参数)构造函数].
请为 Block 定义无参数构造函数。
public 块(){}
我正在尝试创建一个超级构造函数,但我仍然收到错误消息:隐式超级构造函数 Block() 未定义。必须显式调用另一个构造函数。 似乎在主要 class 中有 2 个构造函数?但我不认为这是导致错误的原因。
主要class:
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());
}
子 class:
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());
}
} 感谢您的帮助!
编辑:我在此处以不同的方式定义了对象 class
public static Block voidiom_ore;
public static void init()
{
voidiom_ore = new ItemVoidiom_Ore();
}
编辑:已修复,感谢您的帮助!
错误是没有构造函数Block()
。要么用无参数定义构造函数 Block()
,要么从 ItemVoidiom_Ore()
Block(Material blockMaterialIn, MapColor blockMapColorIn)
或 Block(Material materialIn)
问题是第二个构造函数 public ItemVoidiom_Ore()
没有调用超类的任何构造函数。
您需要显式调用两个超类构造函数中的一个(就像您在第一个构造函数中所做的那样)。
默认构造函数是不带参数的构造函数。
当没有显式调用 super
(super class 的构造函数)时,将调用 super class 的默认构造函数。
在你的第二个构造函数中,你没有显式调用超级构造函数,你需要将代码更改为显式调用超级构造函数的代码 class:
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());
}
您需要显式调用超类的现有构造函数之一 class。
另一种方法是向超级 class 块添加默认构造函数。
在 Java 中,每个构造函数必须调用超级 class 的某个构造函数,一直到 java.lang.Object
。如果您自己不添加 super(...)
调用,则会在构造函数的开头自动添加。
在您的例子中,ItemVoidiom_Ore
构造函数不包含任何 super(...)
,因此代码的行为就好像您在开头写了 super()
。但是,class Block
不包含无参数的构造函数。
要解决此问题,您可以将默认构造函数添加到 Block
,或添加一个 super(...)
调用,为 Block
中的两个构造函数变体之一提供参数。
问题出在这里:
public ItemVoidiom_Ore() { setUnlocalizedName(Reference.enumstuff.VOIDIOM_ORE.getUnlocalizedName());
setRegistryName(Reference.enumstuff.VOIDIOM_ORE.getRegistryName());
}
因为你没有提到Block
(超级)使用哪个构造函数Java尝试使用默认构造函数但它不存在所以Java不'不知道使用哪个构造函数来构建 Block
。将默认构造函数添加到 Block
或调用其 2 个构造函数之一
class 构造函数必须始终作为其第一个操作调用其超级class' 构造函数之一。
对于您的第一个 ItemVoidiom_Ore
构造函数,这是明确完成的:
public ItemVoidiom_Ore(Material materialIn) {
super(materialIn); // calls Block(Material) constructor
}
对于您的其他 ItemVoidiom_Ore
构造函数,它没有显式完成,因此有一个对 Block 的(不存在的)默认构造函数的隐式调用。
您需要添加对现有 Block
构造函数的显式调用(如在其他 ItemVoidiom_Ore
构造函数中),或者向 [=13= 添加适当的默认(无参数)构造函数].
请为 Block 定义无参数构造函数。
public 块(){}