Java最终变量初始化
我得到一个错误,该错误表明,即使我在构造函数中初始化了size变量,它也可能尚未初始化。为什么这样不行=Java最终变量初始化,java,Java,我得到一个错误,该错误表明,即使我在构造函数中初始化了size变量,它也可能尚未初始化。为什么这样不行= public class Ore { protected static final float size; protected String name; protected int itemID; protected ArrayList<Mineral> minerals; public Ore(float size, String name, int itemID){
public class Ore {
protected static final float size;
protected String name;
protected int itemID;
protected ArrayList<Mineral> minerals;
public Ore(float size, String name, int itemID){
this.size = size;
this.name = name;
this.itemID = itemID;
}
public String getPrizeData(int itemNumber){
String data = null;
return data;
}
public float getPrice(){
float price = 0;
return price;
}
}
公共类{
保护静态最终浮子尺寸;
受保护的字符串名称;
受保护的int-itemID;
受保护的ArrayList矿物;
公共Ore(浮点大小、字符串名称、int itemID){
这个。大小=大小;
this.name=名称;
this.itemID=itemID;
}
公共字符串getPrizeData(int itemNumber){
字符串数据=null;
返回数据;
}
公开发行价格(){
浮动价格=0;
退货价格;
}
}
将静态
修改器从大小。。。我很确定你不想把它放在那里;) size
是一个静态字段。因此,它必须在声明中直接初始化,或形成一个静态初始值设定项,即如下所示:
public class Ore {
protected static final float size;
static{
size = // add something here
}
//....
}
在java中,final
和static
的组合被视为常量,编译器在编译期间用其值替换代码中任何地方的常量名称(此处size
),因此此处不允许在构造函数中对其进行初始化,并生成编译时错误
因此,要么选择vikingsteve的解决方案,要么在声明时对其进行初始化。按照您现有的方式,可以从或派生一个类,并在该派生类中实现一个公共静态函数,该函数引用大小。这是一种在初始化之前可以访问size
的方法,编译器可以正确地识别它
一种修复方法是在Ore
中使用一个静态初始化器块来初始化size
,或者将其值设置为一个文本:受保护的静态最终浮点大小=/*ToDo-此处的一个文本*代码>值得注意的是,静态上下文很混乱,很难测试和调试,如果可能的话应该避免。我试着写这样的东西,结果弄得一团糟。谢谢你的简明解释,我现在明白了!“编译器在编译期间[…]替换代码中任何地方的常量名”根本不是真的。如果您使用静态函数的值对其进行初始化,则赋值的右侧不再是一个常量表达式,并且不能由编译器内联(JIT编译可能是另一种情况)。不用担心!很高兴这有帮助:)
protected static final float size;