初めてクラスを使用するときは、クラスローダーによってクラスをロードする必要があります。ロードプロセスには次の 2 つの点が含まれます:
(1) クラスをロードするとき、その親クラスがロードされていない場合、その場合、その親クラスはまだロードされていません。親クラスを最初にロードする必要があります。
(2) クラスがメモリにロードされた後、その静的データ フィールドと静的ブロックがコード内に出現する順序で実行されます。
2. クラスのコンストラクターを呼び出すとき、呼び出しプロセスには次の 3 つの点が含まれます:
(1) 親クラスのコンストラクターを呼び出します。コードインスタンスブロック内に出現する順序
(3) コンストラクター本体を実行します。
理論は実践を通じて証明する必要があります。それを証明するための簡単な例を次に示します。
/** * * @author Sel * * 2014.3.29 */public class InitializationDemo { public static void main(String[] args) { new InitializationDemo(); } public InitializationDemo() { new B(); } { System.out.println("2. Initialization 的实例块。"); } static { System.out.println("1. Initialization 的静态块。"); } }class A { A() { System.out.println("6. A 的构造函数体。"); } { System.out.println("5. A 的实例块。"); } static { System.out.println("3. A 的静态块。"); } }class B extends A { B() { System.out.println("8. B 的构造函数体。"); } { System.out.println("7. B 的实例块。"); } static { System.out.println("4. B 的静态块。"); } }
上記の例では、クラスの各部分に対応するテキストが出力されるため、出力から実行順序がわかります。
対応する出力は次のとおりです:
1. Initialization 的静态块。 2. Initialization 的实例块。 3. A 的静态块。 4. B 的静态块。 5. A 的实例块。 6. A 的构造函数体。 7. B 的实例块。 8. B 的构造函数体。
この出力から、プログラムの実行順序は次のとおりであることがわかります:
1. まず、Initialization クラスを使用するために、Initialization クラスがロードされます。静的ブロックが実行されるため、出力は 1; プログラムは Initialization のコンストラクターを呼び出し、Initialization クラスのインスタンス ブロックが実行されるため、出力は 2 になります。の初期化、つまり new B() が実行されます。このとき、クラス B を使用する必要があるため、クラス B をロードする必要があります。が最初にロードされるため、この時点で A のロード処理が実行されます。つまり、A の静的ブロックが実行され、出力 3 がロードされます。このとき、B がロードされます。時間、B のロード処理が実行される、つまり B の静的ブロックが実行されるため、 4 が出力されます
6. ロードが完了したら、コードに従ってコンストラクターである new B() を実行します。 Bの、このとき、親クラスAのコンストラクタを先に呼び出す必要があるので、Aのインスタンスブロックとコンストラクタ本体が順番に実行され、5と6が出力されます
7。 B のコンストラクターを「実際に」実行する時間が来たので (以前 new B() の実行について話しましたが、他のものを呼び出しているため)、B のインスタンス ブロックとコンストラクター本体を順番に実行し、 7 と 8 を出力します。
上記はJavaの静的ブロックとインスタンスブロックについてです。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。