Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java最终变量初始化_Java - Fatal编程技术网

Java最终变量初始化

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){

我得到一个错误,该错误表明,即使我在构造函数中初始化了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){
       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;