靜態代碼塊、構造代碼塊、構造方法、靜態方法等(父子類)執行順序

驗證結果:靜態代碼塊>構造代碼塊>構造函數>靜態方法>普通代碼塊

驗證代碼如下
public class Son extends Father {

    private String name;

    public Son(String name) {
        super(name);
        this.name = name;
        System.out.println("子類帶參數構造");
    }

    public Son() {
        System.out.println("子類不帶參數構造");
    }

    public static void say() {
        System.out.println("我是子類靜態方法");
    }

    public void sayHello() {
        System.out.println("我是子類成員方法");
    }

    static {
        System.out.println("子類靜態代碼塊1");
    }
    static {
        System.out.println("子類靜態代碼塊2");
    }
    {
        System.out.println("子類構造代碼快");
    }

    public static void main(String[] args) {
        System.out.println("-------------分隔線:執行無參對象創建及方法(第一次)-------------------");
        Father father1 = new Son();
        father1.sayHello();
        System.out.println("-------------分隔線:執行無參對象創建及方法(第二次)-------------------");
        Father father2 = new Son();
        father2.sayHello();
        System.out.println("-------------分隔線:執行帶參對象創建及方法-------------------");
        Father father3 = new Son("Carson");
        father3.sayHello();
        System.out.println("-------------分隔線:執行靜態方法-------------------");
        Son.say();
    }
}

class Father {
    private String name;

    public Father(String name) {
        this.name = name;
        System.out.println("父類帶參數構造");
    }

    public Father() {
        System.out.println("父類不帶參數構造");
    }

    public static void say() {
        System.out.println("我是父類靜態方法");
    }

    public void sayHello() {
        System.out.println("我是父類成員方法");
    }

    static {
        System.out.println("父類靜態代碼塊1");
    }
    static {
        System.out.println("父類靜態代碼塊2");
    }
    {
        System.out.println("父類構造代碼快");
    }
}
執行結果如下
父類靜態代碼塊1
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態代碼塊2
-------------分隔線:執行無參對象創建及方法(第一次)-------------------
父類構造代碼快
父類不帶參數構造
子類構造代碼快
子類不帶參數構造
我是子類成員方法
-------------分隔線:執行無參對象創建及方法(第二次)-------------------
父類構造代碼快
父類不帶參數構造
子類構造代碼快
子類不帶參數構造
我是子類成員方法
-------------分隔線:執行帶參對象創建及方法-------------------
父類構造代碼快
父類帶參數構造
子類構造代碼快
子類帶參數構造
我是子類成員方法
-------------分隔線:執行靜態方法-------------------
我是子類靜態方法

有這麼幾點說明

(下面所說的,對象的創建,是new出來的對象)

  • 靜態代碼塊
    • 不管對象創建幾次(或者說不管創不創建對象),只執行一次,且優先級最高(因爲在對象創建之前就已加載完畢)
    • 多個靜態代碼塊按代碼順序來執行
  • 構造代碼塊
    • 創建幾次對象就執行幾次,優先級在靜態代碼塊之後,在構造方法之前執行
  • 構造方法
    • 創建幾次就執行幾次,在靜態方法之前執行
  • 靜態方法
    • 在構造方法之後執行(因爲類得先加載出來,才能執行此類的靜態方法。然而在加載該類時,構造代碼塊和構造方法就執行了)
整個過程都是父比子先執行,且構造代碼塊和構造方法是整體的父先子後的順序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章