1. 程式人生 > >java 初始化塊

java 初始化塊

初始化塊:
    靜態初始化塊;非靜態初始化塊
    執行順序:
        所有的靜態初始化塊都優先執行,其次才是非靜態的初始化塊和建構函式,它們的執行順序是:
            1父類的靜態初始化塊
            2子類的靜態初始化塊
            3父類的初始化塊
            4父類的建構函式
            5子類的初始化塊
            6子類的建構函式
    每個類的靜態初始化塊都只在第一次例項化該類物件時執行一次

    
    說明:
        靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;
        非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;
        非靜態初始化塊的程式碼會在類建構函式之前執行。因此若要使用,應當養成把初始化塊寫在建構函式之前的習慣,便於除錯;
        靜態初始化塊既可以用於初始化靜態成員變數,也可以執行初始化程式碼;
        非靜態初始化塊可以針對多個過載建構函式進行程式碼複用
    例子
         1 class A {
         2     static {
         3         System.out.println("Static init A.");
         4     }
         5
         6     {
         7         System.out.println("Instance init A.");
         8     }
         9
        10     A() {
        11         System.out.println("Constructor A.");
        12     }
        13 }
        14
        15 class B extends A {
        16     static {
        17         System.out.println("Static init B.");
        18     }
        19
        20     {
        21         System.out.println("Instance init B.");
        22     }
        23
        24     B() {
        25         System.out.println("Constructor B.");
        26     }
        27 }
        28
        29 class C extends B {
        30
        31     static {
        32         System.out.println("Static init C.");
        33     }
        34
        35     {
        36         System.out.println("Instance init C.");
        37     }
        38
        39     C() {
        40         System.out.println("Constructor C.");
        41     }
        42 }
        43
        44 public class Main {
        45
        46     static {
        47         System.out.println("Static init Main.");
        48     }
        49
        50     {
        51         System.out.println("Instance init Main.");
        52     }
        53
        54     public Main() {
        55         System.out.println("Constructor Main.");
        56     }
        57
        58     public static void main(String[] args) {
        59         C c = new C();
        60         B b = new B();
        61     }
        62 }
        結果:
        (C c = new C())
        Static init Main.  --main函式再Main類中呼叫,先初始化Main類
        Static init A.   --父父類static塊  ((靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;)
        Static init B.   --父類static塊
        Static init C.   --子類static塊
        Instance init A.   --父父類非static塊
        Constructor A.    --父父類建構函式
        Instance init B.  --父類非static塊
        Constructor B.    --父類建構函式
        Instance init C.  --子類非static塊
        Constructor C.     --子類建構函式
        (B b = new B())
        Instance init A.    --父類非static塊 (靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;)
        Constructor A.       --父類建構函式
        Instance init B.    --子類非static塊
        Constructor B.      --子類建構函式