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";
    }
}

この場合、クラスStaticVariableDemoNestedクラスをロードします。 静的変数nestedClassStaticVariableを初期化します。

6. 結論

この短い記事では、静的変数の初期化について簡単に説明しました。 詳細については、Java言語仕様を確認してください。

いつものように、コードスニペットはGitHubで入手できます。