Javaクラスのロードとインスタンス化の実行順序の詳細
≪クラス・ロード|Class Load|emdw≫:プログラムがクラスをアクティブに使用する場合、クラスがメモリにロードされていない場合、システムはロード、リンク、初期化の3つのステップでクラスを初期化し、JVMは3つのステップを連続的に完了し、総称してクラス・ロードまたはクラス初期化と呼ばれます.≪クラスをロードするタイミング|Load Class Time|emdw≫:クラス情報を最初に使用する必要がある場合にロードします.クラスロードの原則:遅延ロード、ロードしないでロードしないことができます.クラスのロードをトリガーするいくつかの状況:(1)静的メンバーを呼び出すと、静的メンバーが本当に存在するクラスとその親がロードされます.サブクラスで親の静的メンバーを呼び出すと、親のみがロードされ、子クラス(2)の最初のnewオブジェクトがロードされないときにロードされ、後で(3)子クラスを再ロードする必要がなく、親がロードされます.
ロードメソッドは実行メソッドに等しくなく、初期化変数には値が割り当てられます.クラス・ロードの順序は、「静的メソッドのロード」>「静的変数の初期化」>「静的コード・ブロックのインスタンス化を実行する場合、非静的メソッドのロード」>「非静的変数のインスタンス化」>「コード・ブロックの構築の実行」>「構造関数の実行」です.
結果は次のとおりです.
ロードメソッドは実行メソッドに等しくなく、初期化変数には値が割り当てられます.クラス・ロードの順序は、「静的メソッドのロード」>「静的変数の初期化」>「静的コード・ブロックのインスタンス化を実行する場合、非静的メソッドのロード」>「非静的変数のインスタンス化」>「コード・ブロックの構築の実行」>「構造関数の実行」です.
public class InitializeDemo {
//
private static int k = 1;
//
/**
* new ,
* 1. :{ print(" "); j=100; }
* 2. : private int j = print("j");
* 3. :: i= n=
* 4. :private static InitializeDemo t1= new InitializeDemo("t1");
*/
private static InitializeDemo t1= new InitializeDemo("t1");
// ,
private static InitializeDemo t2= new InitializeDemo("t2");
// :i i= 6 n = 6
private static int i = print("i");
//
static {
print(" ");
n = 100;
}
//
private static int n = 99;
//
{
print(" ");
j=100;
}
public InitializeDemo(String str) {
System.out.println((k++) + ":" + str + " i= " + i + " n = " + n);
++i;
++n;
}
// : , ( , )
private int j = print("j");
public static int print(String str) {
System.out.println((k++) + ":" + str + " i= " + i + " n = " + n);
++n;
return ++i;
}
public static void main(String[] args) {
InitializeDemo n = new InitializeDemo(" ");
}
}
結果は次のとおりです.
1: i= 0 n = 0
2:j i= 1 n = 1
3:t1 i= 2 n = 2
4: i= 3 n = 3
5:j i= 4 n = 4
6:t2 i= 5 n = 5
7:i i= 6 n = 6
8: i= 7 n = 7
9: i= 8 n = 99
10:j i= 9 n = 100
11: i= 10 n = 101