プロジェクトにいくつかのクラスが含まれており、それぞれに静的初期化ブロックがあるとします。これらのブロックはどのような順序で実行されますか? クラス内では、そのようなブロックはコードに表示される順序で実行されることを知っています。クラス間で同じだと読んだことがありますが、私が書いたいくつかのサンプルコードはそれに同意しません。私はこのコードを使用しました:
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");
}
}
そして、この出力を得ました:
START
静的 - 祖父母
静的 - 親
静的 - 子
インスタンス - 祖父母
コンストラクター - 祖父母
インスタンス - 親
コンストラクター - 親
インスタンス - 子
コンストラクター - 子
END
そこから明らかな答えは、親のブロックが子のブロックよりも先に実行されるということですが、これは偶然の一致である可能性があり、2 つのクラスが同じ階層にない場合は役に立ちません。
編集:
これを 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");
}
}
クラス名が示すように、新しいクラスをどこにも参照していません。新しいプログラムは、古いプログラムと同じ出力を生成しました。