これ以上言っても無駄です。以下は私が個人的にテストしたコードですが、一目瞭然です:
1 package test1; 2 3 public class Test { 4 public static void main(String[] argc) { 5 new Child(); 6 System.out.println("================================"); 7 new Child(); 8 } 9 } 10 11 class Child extends Parent{ 12 private static String staticField = getStaticField(); 13 static { 14 System.out.println("child静态方法块初始化"); 15 } 16 private String field = getField(); 17 { 18 System.out.println("child普通方法块初始化"); 19 } 20 21 public Child() { 22 System.out.println("child构造函数初始化"); 23 } 24 25 public static String getStaticField() { 26 System.out.println("child静态属性初始化"); 27 return "staticField"; 28 } 29 30 public static String getField() { 31 System.out.println("child普通属性初始化"); 32 return "field"; 33 } 34 } 35 36 class Parent { 37 private static String staticField = getStaticField(); 38 static { 39 System.out.println("parent静态方法块初始化"); 40 } 41 private String field = getField(); 42 { 43 System.out.println("parent普通方法块初始化"); 44 } 45 46 public Parent() { 47 System.out.println("parent构造函数初始化"); 48 } 49 50 public static String getStaticField() { 51 System.out.println("parent静态属性初始化"); 52 return "staticField"; 53 } 54 55 public static String getField() { 56 System.out.println("parent普通属性初始化"); 57 return "field"; 58 } 59 }
印刷結果:
1 parent静态属性初始化 2 parent静态方法块初始化 3 child静态属性初始化 4 child静态方法块初始化 5 parent普通属性初始化 6 parent普通方法块初始化 7 parent构造函数初始化 8 child普通属性初始化 9 child普通方法块初始化 10 child构造函数初始化 11 ================================ 12 parent普通属性初始化 13 parent普通方法块初始化 14 parent构造函数初始化 15 child普通属性初始化 16 child普通方法块初始化 17 child构造函数初始化
静的属性と静的初期化ブロックの宣言順序を置き換えると、静的属性と静的初期化ブロックの初期化順序は宣言順序と関係があり、同様に通常属性と通常初期化ブロックの初期化順序も宣言順序と関係があることがわかります。宣言の順番。
要約:
クラスが初期化の条件を満たした場合 (将来のブログで概要を説明します)、親クラスが最初に初期化され (最上位の親クラス Object から下に向かって初期化されます)、次にサブクラスが初期化されます。
このクラスを初期化するとき、静的プロパティと静的初期化ブロックが最初に初期化され (宣言順序に関連して)、最上位の親クラス Object から下位に初期化されます。 new を使用してオブジェクトを作成する場合、最初に通常のプロパティと通常の初期化ブロック (宣言順序に関連する) を初期化し、次にコンストラクター メソッドを呼び出して、これも最上位の親クラス Object から下位に実行します。
## 静的プロパティと静的初期化ブロックは 1 回だけ初期化されます。クラスが初期化された後、再度 new を使用してオブジェクトを作成しても、3 番目の手順が繰り返されるだけです。クラス内では、変数定義の順序によって初期化の順序が決まります。変数定義がメソッド定義間に分散している場合でも、メソッド (コンストラクターを含む) が呼び出される前に初期化されます。
以上がJavaクラスの初期化順序は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。