Java 継承における静的ブロックとインスタンス ブロックの初期化順序は何ですか?

Patricia Arquette
リリース: 2024-11-27 07:00:14
オリジナル
154 人が閲覧しました

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

Java の静的ブロックとインスタンス ブロックの初期化シーケンス

Java で複数のクラスを操作する場合、静的ブロックとインスタンスの実行順序を理解する初期化ブロックが重要になります。クラス内では、これらのブロックが出現順に実行されることが知られていますが、クラス間でのブロックの動作については不確実性が残ります。

この動作を実証するには、次のコードを検討してください。

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
static - grandparent
static - parent
static - child
instance - grandparent
constructor - grandparent
instance - parent
constructor - parent
instance - child
constructor - child
END
ログイン後にコピー

ただし、この観察だけでは、親クラスと子クラスの間の初期化順序が明確になっていません。この側面をさらに詳しく調べるには、次の未使用クラスをコードに追加することを検討してください。

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");
    }
}
ログイン後にコピー

驚くべきことに、変更されたコードでも元のコードと同じ出力が生成されます。これは、静的初期化子ブロックとインスタンス初期化子ブロックが次の順序で実行されることを意味します:

  • すべてのクラスとインターフェイスの静的初期化子ブロックは、依存関係に関係なく、幅優先の上から下の順序で実行されます。
  • すべての静的初期化ブロックが実行されると、すべてのクラスのインスタンス初期化ブロックとコンストラクターが、クラスが初期化された順序で実行されます。

この動作は Java 言語仕様 (JLS) に準拠しており、セクション 12.4 および 12.5 で詳細な説明が提供されています。

以上がJava 継承における静的ブロックとインスタンス ブロックの初期化順序は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート