Java中的初始化塊和構造器的執行順序
阿新 • • 發佈:2018-11-10
我們都知道java中不但有構造器,還有初始化塊和靜態初始化塊的概念,今天我們就來看看他們之間的執行順序是怎樣的。
我們來看一個例子:
package test; class Root { static { System.out.println("Root的靜態初始化塊"); } { System.out.println("Root的普通初始化塊"); } public Root() { System.out.println("Root的無參構造"); } } class Mid extends Root { static { System.out.println("Mid的靜態初始化塊"); } { System.out.println("Mid的普通初始化塊"); } public Mid() { System.out.println("Mid的無參構造"); } public Mid(String name) { this(); System.out.println("Mid的帶參構造器" + name); } } class Leaf extends Mid { static { System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf() { super("瘋狂java講義"); System.out.println("Leaf的無參構造"); } } public class Test { public static void main(String[] args) { new Leaf(); new Leaf(); } }
該段程式碼的執行結果如下:
從程式碼執行的結果來看,我們可以知道三點:
1.類的初始化階段,先執行最頂層的父類的靜態初始化塊,然後依次向下執行,直到執行當前類的靜態初始化塊
2.物件初始化階段,先執行最頂層父類的初始化塊,最頂層父類的構造器,然後依次向下,直到執行當前類的初始化塊當前類的構造器。
3.當第二次建立物件時,由於這些類在第一次建立物件時已經被載入過了,因此靜態初始化塊只會執行一次。
總結一下三者的執行順序:
1.父類的靜態初始化塊
2.子類的靜態初始化塊
3.父類的初始化塊
4.父類的建構函式
5.子類的初始化塊
6.子類的建構函式