- java中的靜態(tài)代碼塊,非靜態(tài)塊,構造辦法的加載順序是這樣的:
靜態(tài)代碼塊 (程序加載時一次)--->非靜態(tài)塊(每次實例化一次)---> 構造方法(每次實例化一次),廢話不多說,上代碼。
A類:
public class A { static { System.out.print("1"); } { System.out.print("#"); } public A(){ System.out.print("a"); } }
B類:
/** * @Author: Cyy * @Description: * @Date:Created in 16:08 2018/7/28 */ public class B extends A { static { System.out.print("2"); } { System.out.print("*"); } public B(){ System.out.print("b"); } { System.out.print("c"); } public static void main(String[] args) { // A a=new A();//結果12a,執(zhí)行一次2個靜態(tài)區(qū)代碼,執(zhí)行非靜態(tài)代碼塊,再執(zhí)行A的構造辦法 // B b=new B();//結果12ab,執(zhí)行一次2個靜態(tài)區(qū)代碼,執(zhí)行非靜態(tài)代碼塊,再依次執(zhí)行A和B的構造辦法 A ab=new B();//同上 ab=new B();//此時靜態(tài)代碼塊已經(jīng)加載,只加載一次,執(zhí)行非靜態(tài)代碼塊,是每次實例化都一次,跟構造方法一樣,比構造辦法先,輸出非靜態(tài)代碼和構造辦法的部分 } }
我們嘗試運行,看看結果:

image.png
結果是12#a*b#a*b,來分析下整個流程:
- 第一步按順序加載2個類的靜態(tài)代碼塊,程序載入時,只會執(zhí)行一次,輸出12;
- 第二步按順序分別加載A類和B類的非靜態(tài)代碼塊以及構造方法,輸出#a*b;
- 第三步,再次實例化B類的時候,不在靜態(tài)代碼塊了,只會加載非靜態(tài)代碼塊和構造方法,再次輸出結果#a*b;