Javaで静的変数はいつ初期化されますか?
1. 序章
このチュートリアルでは、静的変数の初期化プロセスについて説明します。 Java仮想マシン(JVM)は、クラスのロード中にこのプロセスに従います。
2. 初期化プロセス
大まかに言うと、JVMは次の手順を実行します。
まず、クラスがロードされ、リンクされます。 次に、このプロセスの「初期化」フェーズで静的変数の初期化が処理されます。 最後に、クラスに関連付けられているmainメソッドが呼び出されます。
次のセクションでは、クラス変数の初期化について説明します。
3. クラス変数
Javaでは、静的変数はクラス変数とも呼ばれます。 つまり、それらはクラスに属し、特定のインスタンスには属しません。 その結果、クラスの初期化は静的変数を初期化します。
対照的に、クラスのインスタンスはインスタンス変数(非静的変数)を初期化します。 クラスのすべてのインスタンスは、クラスの静的変数を共有します。
クラスStaticVariableDemoの例を見てみましょう。
public class StaticVariableDemo {
public static int i;
public static int j = 20;
public StaticVariableDemo() {}
}
最初に、JVMはクラスStaticVariableDemoのクラスオブジェクトを作成します。 次に、 static フィールド初期化子は、静的フィールドに意味のあるデフォルト値を割り当てます。 上記の例では、クラス変数iは最初にintデフォルト値のゼロで初期化されます。
テキストの順序は静的フィールドに適用されます。 まず、 i が初期化され、次にjが初期化されます。 その後、クラスとその静的メンバーが他のクラスに表示されます。
4. 静的ブロック内の変数
別の例を見てみましょう:
public class StaticVariableDemo {
public static int z;
static {
z = 30;
}
public StaticVariableDemo() {}
}
この場合、変数の初期化は順番に行われます。 たとえば、JVMは最初に変数zをデフォルトのint値0に割り当てます。 次に、 static ブロックで、30に変更されます。
5. 静的ネストクラスの変数
最後に、外側のStaticVariableDemoクラス内のネストされたクラスの例を見てみましょう。
public class StaticVariableDemo {
public StaticVariableDemo() {}
static class Nested {
public static String nestedClassStaticVariable = "test";
}
}
この場合、クラスStaticVariableDemoはNestedクラスをロードします。 静的変数nestedClassStaticVariableを初期化します。
6. 結論
この短い記事では、静的変数の初期化について簡単に説明しました。 詳細については、Java言語仕様を確認してください。
いつものように、コードスニペットはGitHubで入手できます。