Java静的コードブロック、非静的コードブロック、静的変数、インスタンス変数、構造関数の実行順序を詳細に解読

2299 ワード

1、まず親を考慮せずに、本クラスのみを考慮する場合、実行順序は次のとおりです.
静的コードブロック|静的変数->非静的コードブロック|インスタンス変数->コンストラクション関数
静的コードブロックと静的変数の実行の前後順序はコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するParentクラスを新規作成します.
public class Parent {
    public static int i = 1;

    static {
        i = 4;
        System.out.println("====     ");
    }

    public Parent() {
        i = 2;
        System.out.println("====    ");
    }

    {
        i = 3;
        System.out.println("====      ");
    }

    public static void main(String[] args) {
        System.out.println("======"+i);
        new Parent();
        System.out.println("======"+i);
    }
}

コード出力結果:
    ====スタティツクコードブロック    ======4     ====非静的コードブロック    ====コンストラクタ    ======2
実行順序がはっきりしている
2.次に、親が存在する場合の実行順序を続けます.
親静的ブロック|親静的変数->子静的ブロック|子静的変数->親非静的ブロック|親インスタンス変数->親コンストラクション関数->子非静的ブロック|子インスタンス変数->子コンストラクション関数
親クラスとサブクラスの静的コードブロックと静的変数の実行の前後順序は依然としてコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するChildクラス継承パラメータクラスを新規作成します.
public class Parent {
    public static int i = 1;

    static {
        i = 4;
        System.out.println("====       ");
    }

    public Parent() {
        i = 2;
        System.out.println("====      ");
    }

    {
        i = 3;
        System.out.println("====        ");
    }
}
class Child extends Parent{
    public Child() {
        i = 6;
        System.out.println("######      ");
    }

    {
        i = 7;
        System.out.println("######        ");
    }
    static {
        i = 8;
        System.out.println("######       ");
    }

    public static void main(String[] args) {
        System.out.println("######i="+i);
        new Child();
        System.out.println("######i="+i);
    }
}

実行結果は次のとおりです.
    ====親静的コードブロック    ######サブクラス静的コードブロック    ######i=8     ====親非静的コードブロック    ====親コンストラクション関数    ######サブクラス非静的コードブロック    ######サブクラスコンストラクタ    ######i=6
3、まとめ:
1.クラスコンテンツ(静的変数、静的初期化ブロック)=>インスタンスコンテンツ(変数、初期化ブロック、コンストラクタ)
2、親(静的変数、静的初期化ブロック)=> サブクラスの(静的変数、静的初期化ブロック)=>親クラスの(変数、初期化ブロック、コンストラクタ)=>サブクラス        の(変数、初期化ブロック、コンストラクタ)