1. ホーム
  2. java

[解決済み] Java の静的/インスタンス・イニシャライザー・ブロックはどのような順序で実行されるのですか?

2022-12-08 09:40:22

質問

あるプロジェクトにいくつかのクラスがあり、それぞれに静的イニシャライザブロックがあるとします。 これらのブロックはどのような順序で実行されますか。 私は、クラス内で、そのようなブロックがコードに表示される順序で実行されることを知っています。 しかし、私が書いたいくつかのサンプルコードはそれに反しています。 私はこのコードを使用しました。

package pkg;

public class LoadTest {
    public static void main(String[] args) {
        System.out.println("START");
        new Child();
        System.out.println("END");
    }
}

class Parent extends Grandparent {
    // Instance init block
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }

    // Static init block
    static {
        System.out.println("static - parent");
    }
}

class Grandparent {
    // Static init block
    static {
        System.out.println("static - grandparent");
    }

    // Instance init block
    {
        System.out.println("instance - grandparent");
    }

    // Constructor
    public Grandparent() {
        System.out.println("constructor - grandparent");
    }
}

class Child extends Parent {
    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }

    // Static init block
    static {
        System.out.println("static - child");
    }

    // Instance init block
    {
        System.out.println("instance - child");
    }
}

を実行すると、このような出力が得られます。

開始

静的 - 祖父母

静的 - 親

静的 - 子

インスタンス - 祖父母

コンストラクタ - グランドペアレント

インスタンス - 親

コンストラクタ - 親

インスタンス - 子

コンストラクタ - 子

END

そこから得られる明白な答えは、親のブロックは子のブロックより先に実行されるということですが、それは単なる偶然かもしれませんし、2つのクラスが同じ階層にない場合は役に立ちません。

EDIT

LoadTest.javaにこれを追記して、サンプルコードを修正しました。

class IAmAClassThatIsNeverUsed {
    // Constructor
    public IAmAClassThatIsNeverUsed() {
        System.out.println("constructor - IAACTINU");
    }

    // Instance init block
    {
        System.out.println("instance - IAACTINU");
    }

    // Static init block
    static {
        System.out.println("static - IAACTINU");
    }
}

クラス名からわかるように、私は新しいクラスをどこにも参照しませんでした。 新しいプログラムは古いものと同じ出力を生成しました。

どのように解決するのですか?

クラスの静的イニシャライザーは、インスタンスの生成、静的メソッドやフィールドへのアクセスなど、そのクラスに初めてアクセスした際に実行されます。

したがって、複数のクラスについて、これは完全にこれらのクラスがロードされるために実行されるコードに依存します。