閒言少敘,看代碼java
package ppt_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 msg) { //經過this調用同一類中重載的構造器 this(); System.out.println("Mid的帶參數構造器,其參數值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf() { //經過super調用父類中有一個字符串參數的構造器 super("Java初始化順序演示"); System.out.println("執行Leaf的構造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
這是運行結果,但是爲啥是這樣呢?函數
原來是由於 this
1.靜態初始化塊只執行一次。對象
2.在構建子類對象時,先構建父類的對象,以後一次執行相應的靜態語句塊,而後依次執行相應的普通語句塊和構造函數,當在子類中有super();時,分類的構造函數使用super();調用的父類構造函數blog