Java初始化順序
Java初始化的順序如下:
[靜態變數, 靜態初始化塊] > [變數, 變數初始化塊] > 構造方法
靜態變數和靜態初始化塊之間沒有先後關係, 遵循程式碼的先後順序, 寫在前面就先初始化, 所以如果你想要在靜態初始化塊裡引用在之後宣告的一個靜態變數, 會收到一個Compile Error
.
public class InitialOrder {
public static final void main(String[] args) {
System.out.println("test: " + Test.STATIC_VARIABLE); //flag1
//Test test = new Test(); //flag2
}
}
class Test {
static String STATIC_VARIABLE = "static_variable";
static {
System.out.println(STATIC_VARIABLE);
System.out.println("static_code_block");
}
static {
System.out.println("another_code_block");
}
private String memberVariable = "member_variable";
{
System.out.println(memberVariable);
System.out.println("code_block");
}
Test() {
System.out.println("construction method");
}
}
輸出:
static_variable
static_code_block
another_code_block
test: static_variable
可以看到, 當一個類的靜態變數被引用時, 所有的靜態變數以及靜態初始化塊都將被初始化. 這時候, 由於還沒有例項化物件, 故非靜態的初始化都不會進行.
如果我們註釋掉flag1處程式碼, 恢復flag2處程式碼, 執行結果如下:
static_variable
static_code_block
another_code_block
member_variable
code_block
construction method
當一個類例項化時, 靜態和非靜態的初始化都將進行. 同樣, 非靜態的初始化同樣有要求先後順序, 即一個變數初始化塊不能引用在之後宣告的一個變數, Illegal forward reference
.
帶繼承關係的初始化順序
public class InitialOrderWithInherit {
public static void main(String[] args) {
Child child = new Child();
}
}
class Father {
static String STATIC_VARIABLE = "father_static_variable";
static {
System.out.println(STATIC_VARIABLE);
System.out.println("father_static_code_block");
}
private String memberVariable = "father_member_variable";
{
System.out.println(memberVariable);
System.out.println("father_code_block");
}
Father() {
System.out.println("father_construction");
}
}
class Child extends Father {
static String STATIC_VARIABLE = "child_static_variable";
static {
System.out.println(STATIC_VARIABLE);
System.out.println("child_static_code_block");
}
private String memberVariable = "child_member_variable";
{
System.out.println(memberVariable);
System.out.println("child_code_block");
}
Child() {
System.out.println("child_construction");
}
}
輸出:
father_static_variable
father_static_code_block
child_static_variable
child_static_code_block
father_member_variable
father_code_block
father_construction
child_member_variable
child_code_block
child_construction
若僅僅是引用了Child.STATIC_VARIABLE
, 輸出如下:
father_static_variable
father_static_code_block
child_static_variable
child_static_code_block
child_static_variable
所以我們可以總結出如下順序:
父類--靜態變數
父類--靜態初始化塊
子類--靜態變數
子類--靜態初始化塊
父類--變數
父類--初始化塊
父類--構造器
子類--變數
子類--初始化塊
子類--構造器
相關文章
- Java 類初始化順序Java
- Java類初始化順序Java
- java類初始化的順序Java
- JAVA物件的初始化順序Java物件
- Java類(繼承)初始化順序Java繼承
- Java中class的初始化順序Java
- 關於java的初始化順序Java
- 九、 Java程式初始化的順序(二)Java
- 淺談Java類中的變數初始化順序Java變數
- Java初始化靜態變數的時間順序Java變數
- c#物件初始化順序C#物件
- 程式碼說事 之 建立java物件的初始化順序Java物件
- Java子類和父類的初始化執行順序Java
- Java static變數、作用域、建構函式初始化順序Java變數函式
- C++建構函式初始化順序C++函式
- c#類的成員初始化順序C#
- C++和C#物件初始化順序C++C#物件
- Java實現順序表Java
- java類載入順序Java
- 類的成員變數的初始化順序變數
- Java父子類載入順序Java
- java運算子優先順序Java
- JAVA中取順序號 (轉)Java
- JVM類載入機制與類初始化順序JVM
- java setPriority()設定優先順序Java
- Java框架學習順序是哪些Java框架
- Java框架學習順序是哪些?Java框架
- Java 修飾符順序問題Java 修飾符
- java執行緒優先順序Java執行緒
- Java類的基本執行順序Java
- 總結類初始化時的程式碼執行順序
- 學Java,Java書籍的最佳閱讀順序Java
- Java的類的例項化順序Java
- Java流程控制02:順序結構Java
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- Linux核心驅動程式初始化順序的調整(轉)Linux
- 順序表
- python運算子及優先順序順序Python