2014-11-23 75 views
-1

下面的代碼給我一個錯誤The blank final field a may not have been initialized爲什麼我們不能用默認值聲明常量?

public class Test { 

    public static final int a; 

    public static void main(String[] args) { 

    } 
} 

  • 爲什麼不能常量保持一個整數的默認值?
+2

因爲它可能會導致開發艾洛普錯誤。 – 2014-11-23 18:47:25

+0

public static final int a = 0;並且一切都會好起來的) – Maksym 2014-11-23 19:10:57

回答

4

因爲這將沒有多大意義。你有多少不變的原始常數默認值會在你的一生需要什麼?作爲參考,請參見https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html - 作爲常量的唯一實際值是字面值0(轉換爲不同的數字類型,但仍然是0,請注意),falsenull。 Sun做出了設計決定,在沒有指定值的情況下(8.3.1.2 final Fields,注意明確指定)不允許final:在99.9%的實際情況下,當它被編譯器遇到時,僅僅是由於程序員的錯誤(忘記指定一個值),而不是有意識的設計選擇。

這就是說,你應該知道,你其實可以做到這一點。

public class Test { 

    public static int a0; // inited to default value 
    public static final int a = a0; // final with a default value 

    public static void main(String[] args) { 

    } 
} 
-1

它可以容納一個默認值,問題是(由錯誤消息指出)是必須指定a其值應爲您的應用程序,例如默認值

public static final int a = 42 

編輯

這是由一段8.3.1.2 final Fields在Java語言規範規定:

空白final類變量必須由類的靜態初始化被明確賦值,其中特此聲明,或發生編譯時錯誤

+0

向下投票者,你是否介意解釋你爲什麼認爲這是一個不好的答案? – matsev 2014-11-23 19:03:08

+1

,因爲你錯了; '你必須指定哪個值應該是你的應用程序的默認值' - 不僅你不能指定一個整數的默認值* - 實際上,你不能** - 它已經被指定了由Java規範* https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html'數據類型:整數默認值:0'-指定整數不同的默認值的唯一途徑值比'0'要編輯和重新編譯自己的Java版本。你已經誤將字段*的默認值與*字段的初始值*相混淆了。 – vaxquis 2014-11-23 19:07:38

+0

@vaxquis當然,'int'的默認值是'0'。但是,這個問題的問題是靜態最終變量未初始化,請參閱我的更新中的JLS引用。 – matsev 2014-11-23 19:24:52

相關問題