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 サイトの他の関連記事を参照してください。