2014-06-17 149 views
2

我得到一个错误,说大小变量可能没有被初始化,即使我已经在构造函数中初始化了它。 ?为什么不这项工作=Java最终变量初始化

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; 
    } 
} 

回答

4

下降从大小static修改......我敢肯定,你不希望它有;)

+0

你认为解决它的权利感谢:) – Skretch

+0

没有后顾之忧!很高兴帮助:) – vikingsteve

0

size是一个静态字段。因此它必须在声明直接初始化或形成静态初始化,即是这样的:

组合的 finalstatic
public class Ore { 

    protected static final float size; 

    static{ 
     size = // add something here 
    } 
    //.... 
} 
+0

值得注意的是,静态环境很混乱,很难测试和调试,应尽可能避免。 – vikingsteve

1
protected static final float size; 

在Java被认为CONSTANT编译用代码中的值替换常量名称(这里是size),因为在编译过程中它的值不允许在constructor中初始化它并生成编译时错误。


因此,无论去为vikingsteve的溶液或在申报时对其进行初始化。

+0

我试图写这样的东西,并得到可怕的混乱。感谢您提供清晰简洁的解释,现在对我来说很明显! – RossC

+0

“在编译过程中,编译器在代码中的任何地方都会替换常量名”,这是不正确的。如果你初始化它,例如使用静态函数的值,赋值的右侧不再是常量表达式,并且不能由编译器内联(JIT编译可能是不同的故事)。 – fabian

0

你有事情的方式,可能从Ore派生类并实现在派生类是指size公共静态函数。这是在初始化之前可以访问size的一种方式,并且编译器正确地识别了这种情况。

一个补丁修复将是Ore其中初始化size使用静态初始化器块,或者它的值设置为文字:protected static final float size = /*ToDo - a literal here*/;