Java - 26 程式碼塊

wajiez發表於2024-10-31

Java - 26 程式碼塊

[修飾符 static]{
  程式碼  
};

類似於方法,沒有方法名,沒有返回,沒有引數

不用透過物件或類 顯式呼叫,而是在載入類 或 建立物件時 隱式呼叫

普通程式碼塊

好處

構造器的補充機制(減少程式碼重複冗餘),可以做初始化操作

/* 不管呼叫哪個構造器建立物件,都會先呼叫程式碼塊的內容 */
class Movie{
    private String name;
    private String director;
    
    {
        System.out.println("電影開始了");
    }
    
    public Movie(String name){
        this.name = name;
    }
    public Movie(String name, String director){
        this.name = name;
        this.director = director;
    }
}

細節

  1. 靜態程式碼塊 隨著類的載入而執行只會執行一次

​ 普通程式碼塊 每建立一個物件 (new, 和類載入無關) 就執行一次

類什麼時候被載入

  • 建立物件例項 (new)

  • 建立子類物件例項,父類也會被載入

  • 使用類的靜態成員

  1. 建立一個物件在一個類呼叫優先順序

① 靜態程式碼和靜態屬性初始化(如果多個,按定義的順序呼叫)

A a = new A(); // (1)"getN1 被呼叫"; (2)"A 靜態程式碼塊01"

class A{
    private static int n1 = getN1();
    
    static{
        System.out.println("A 靜態程式碼塊01");
    }
    
    public static int getN1(){
        System.out.println("getN1 被呼叫");
        return 100;
    }
}

② 普通程式碼塊和普通屬性初始化(如果多個,按定義的順序呼叫)

③ 構造器

  1. 構造器 最前面隱含了 super() 和 呼叫普通程式碼塊

  2. 建立子類物件時,呼叫順序

① 父類的靜態程式碼塊和靜態屬性

② 子類的靜態程式碼塊和靜態屬性

③ 父類的普通程式碼塊和普通屬性初始化

④ 父類的構造方法

⑤ 子類的普通程式碼塊和普通屬性初始化

⑥ 子類的構造方法

  1. 靜態程式碼塊只能呼叫靜態成員,普通程式碼塊可以呼叫任意成員

相關文章