Java の静的ブロックとインスタンス ブロックについて。

黄舟
リリース: 2017-02-07 11:03:21
オリジナル
1517 人が閲覧しました

初めてクラスを使用するときは、クラスローダーによってクラスをロードする必要があります。ロードプロセスには次の 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) に注目してください。

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