初始化操作的一般順序是(類加載後和之前第一次使用):
- 靜態爲了它出現在代碼(類)的代碼塊,
- 對象代碼以便它出現在代碼中(初始化塊和賦值)。
- 構造
當然,我不指代的構造和功能體如上述一個碼塊。
我不知道如何final static
領域。它們看起來像遵循static
字段的規則,並且在聲明之前無法引用它們,儘管先前的註釋表明它們在編譯步驟時已初始化。
Example.java:8: illegal forward reference
System.err.println("1st static block j=" + j);
也許final static
字段可以初始化並編譯成class文件,但是這不是一個一般的規則,他們仍然不能聲明之前引用:如果之前還有一個編譯錯誤被引用。
實施例的代碼來檢查初始化順序:
class Example {
final static int j = 5;
{
System.err.println("1st initializer j=" + j);
}
static {
System.err.println("1st static block j=" + j);
}
static {
System.err.println("2nd static block j=" + j);
}
final static java.math.BigInteger i = new java.math.BigInteger("1") {
{
System.err.println("final static anonymous class initializer");
}
};
Example() {
System.err.println("Constructor");
}
static {
System.err.println("3nd static block j=" + j);
}
{
System.err.println("2nd initializer");
}
public static void main(String[] args) {
System.err.println("The main beginning.");
Example ex = new Example();
System.err.println("The main end.");
}
}
上面的代碼snipset打印:
1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.
我們是人,而不是計算機。我們是否應該嘗試使代碼更直接,而不是使用這些技巧或陷阱或其他什麼... –
+1因爲這不是一個困難但很好的問題,我相信這將幫助其他人理解語言,特別是靜態修飾符更好。 @JonSkeet提供的非常有用的答案在一個有點重要 - 但經常被低估的話題上。 – jorey
當人們使用'Foo'時,我不喜歡它。使用實際條款:/ – contactmatt