クラスの読み込み
クラスの初期化について話す前に、クラスの読み込み順序を説明しましょう。
以下は、「Java4の思考」から抜粋しています
Javaのすべてがオブジェクトであるため、多くのアクティビティがあります
この問題は、より簡単な例の1つです。次の章で説明するように、各オブジェクトのコードは別のファイルに存在します。コードが本当に必要でない限り、そのファイルはロードされません。一般に、そのクラスのオブジェクトが構築されない限り、コードは実際にはロードされないと考えることができます。静的方法には微妙なあいまいさがあるため、「クラスコードは初めて使用されたときにロードされる」と見なすこともできます。
初めて使用するのは、静的初期化が発生する場所でもあります。ロードすると、すべての静的オブジェクトと静的コードブロックが元の順序で初期化されます(つまり、クラス定義コードで記述される順序)。もちろん、静的データは1回の初期化されます。
簡単に言えば、クラスに相続関係がある場合、クラスローダーはそれを逆方向に形作り、関連するクラスをロードします。
例えば:
クラスBはクラスAを拡張します。新しいb()、クラスローダーはAのコードを自動的にロードします
クラスの初期化順序
通常、初期化シーケンスは次のとおりです。
(静的オブジェクトと静的コードブロック、その順序で初期化)>メンバー変数>コンストラクター
テストコード
public class classinit { / ** * @title:main * @description:class初期化注文テスト * @param args * @return:void * @throws * / public static void main(string [] args){// todo auto-generated method new bew b(); }} class a {static {system.out.println( "aの静的コードブロック..."); } public string s1 = prtstring( "aのメンバー変数..."); public static string s2 = prtstring( "aの静的変数..."); public a(){system.out.println( "a's constructor ..."); } public static string prtstring(string str){system.out.println(str); nullを返します。 }} class bはa {public string ss1 = prtstring( "b'sメンバー変数..."); public static string ss2 = prtstring( "bの静的変数..."); public b(){system.out.println( "b's constructor ..."); } private static a a = new a(); static {system.out.println( "bの静的コードブロック..."); } {system.out.println( "code block ..."); }}テスト結果
Aの静的コードブロック...
Aの静的変数...
Bの静的変数...
...のメンバー変数...
Aのコンストラクター...
Bの静的コードブロック...
...のメンバー変数...
Aのコンストラクター...
Bのメンバー変数...
コードブロック...
bのコンストラクター...
要約します
上記は、Javaのクラスの初期化順序のコンテンツ全体です。 Javaを使用しているすべての人に役立つことを願っています。