我瞭解到,初始化順序分配原則是訂單:在Java中,什麼是初始化爲後主要方法這些語句
- 超類第一個(在此情況下,這裏討論)
- 靜態變量聲明和靜態初始化塊在外觀 的順序
- 實例變量聲明和靜態初始化塊中出現的順序
- 構造
但我還在這個代碼的輸出困惑:
public class Test1 {
static {
add(2);
}
static void add (int num) {
System.out.println(num + " ");
}
public Test1() {
add(5);
System.out.println("Constructor!");
}
static {
add(4);
}
{
add(6);
}
static {
new Test1();
}
{
add(8);
}
public static void main(String[] args) {
System.out.println("Main method!");
add(10);
}
{
add(11);
}
static {
add(12);
}
}
結果是:
2
4
6
8
11
5
Constructor!
12
Main method!
10
如果沒有附加的(10)的發言;加(11);加(12);我完全可以理解。你能解釋一下這3條語句的初始化順序嗎?
要調用*類的初始化,迫使非靜態初始化塊來執行的過程中構造函數代碼*,但沒有按」這意味着它會打破靜態初始化順序。所以你看到'靜態2 4';非靜態(但被稱爲* from * static block)'6 8 11',構造函數'5';然後再靜止塊'12'的其餘部分。現在當類完全初始化時,JVM執行'main'方法('10')。 – Pshemo
您忽略了常量的初始化,這很快就會發生。爲什麼不閱讀關於初始化序列的JLS章節? –