2014-06-17 82 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*/;