java static如何影響類(lèi)的初始化順序

小樊
81
2024-10-10 01:01:40

在Java中,static關(guān)鍵字用于聲明靜態(tài)成員(包括靜態(tài)變量和靜態(tài)代碼塊)。類(lèi)的初始化順序主要受到以下因素影響:

  1. 靜態(tài)變量和靜態(tài)代碼塊的執(zhí)行順序:靜態(tài)代碼塊在類(lèi)加載時(shí)自動(dòng)執(zhí)行,且僅執(zhí)行一次。靜態(tài)變量在類(lèi)加載時(shí)初始化。在靜態(tài)代碼塊中可以對(duì)靜態(tài)變量進(jìn)行賦值操作。因此,靜態(tài)代碼塊的執(zhí)行順序通常決定了靜態(tài)變量的初始化順序。

例如:

public class MyClass {
    static int a;
    static {
        a = 1;
        System.out.println("Static block 1");
    }

    static int b;
    static {
        b = 2;
        System.out.println("Static block 2");
    }
}

輸出順序?yàn)椋?/p>

Static block 1
Static block 2
  1. 非靜態(tài)成員變量的初始化順序:在類(lèi)的構(gòu)造函數(shù)執(zhí)行之前,非靜態(tài)成員變量會(huì)按照它們?cè)陬?lèi)中出現(xiàn)的順序進(jìn)行初始化。

例如:

public class MyClass {
    static int a;
    int b;
    static {
        a = 1;
        System.out.println("Static block");
    }

    public MyClass() {
        b = 2;
        System.out.println("Constructor");
    }
}

輸出順序?yàn)椋?/p>

Static block
Constructor
  1. 繼承關(guān)系中的初始化順序:如果一個(gè)類(lèi)繼承了另一個(gè)類(lèi),那么父類(lèi)的靜態(tài)變量和靜態(tài)代碼塊會(huì)在子類(lèi)之前初始化。在子類(lèi)的構(gòu)造函數(shù)執(zhí)行之前,子類(lèi)的非靜態(tài)成員變量會(huì)按照它們?cè)陬?lèi)中出現(xiàn)的順序進(jìn)行初始化。

例如:

public class ParentClass {
    static int a;
    static {
        a = 1;
        System.out.println("Parent static block");
    }
}

public class ChildClass extends ParentClass {
    static int b;
    int c;
    static {
        b = 2;
        System.out.println("Child static block");
    }

    public ChildClass() {
        c = 3;
        System.out.println("Child constructor");
    }
}

輸出順序?yàn)椋?/p>

Parent static block
Child static block
Child constructor

總之,Java中類(lèi)的初始化順序主要受到靜態(tài)成員和非靜態(tài)成員的聲明順序以及繼承關(guān)系的影響。靜態(tài)代碼塊的執(zhí)行順序通常決定了靜態(tài)變量的初始化順序,而非靜態(tài)成員變量的初始化順序遵循它們?cè)陬?lèi)中出現(xiàn)的順序。

0