🎯

【Java】クラス解説33・スタティックイニシャライザ

2024/05/09に公開

スタティックイニシャライザ

  1. スタティックイニシャライザとは、クラスがロードされる際に一度だけ実行され、その後は再度実行されません。
  2. コンストラクタとの順序については、スタティックイニシャライザが先で、コンストラクタが後になります。
  3. スーパークラスとサブクラスにスタティックイニシャライザが存在する場合は、その実行順はスーパークラスが先で、サブクラスが後になります。

クラスがロードされる際に一度だけ実行されるコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // Fuziクラスの参照
        System.out.println("参照時のcount: " + Fuzi.count);
        // インスタンスの生成及びFuziクラスの参照
        Fuzi fz = new Fuzi();
        System.out.println("生成後のcount: " + Fuzi.count);
    }
}

class Fuzi {
    // スタティックフィールド
    static int count = 0;
    
    // スタティックイニシャライザ
    static {
        System.out.println("スタティックイニシャライザ");
        count++;
    }
}

出力結果

スタティックイニシャライザ
参照時のcount: 1
生成後のcount: 1

出力結果より、Fuziクラスの参照によりスタティックイニシャライザが一度だけ実行され、count0から1に増えます。
その次のインスタンスの生成及びFuziクラスの参照では、スタティックイニシャライザが実行されないので、count1のままです。


スタティックイニシャライザとコンストラクタの順序に係るコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // インスタンスの生成
        Fuzi fz = new Fuzi(2323);
    }
}
class Fuzi {
    // スタティックフィールド
    static int fuzi;
    
    // スタティックイニシャライザ
    static {
        fuzi = 23;
        System.out.println(fuzi);
    }
    
    // コンストラクタ(引数あり)
    Fuzi(int n) {
        fuzi = n;
        System.out.println(fuzi);
    }
}

出力結果

23
2323

出力結果より、実行順はスタティックイニシャライザが先で、コンストラクタが後であることが分かりました。


スーパークラスとサブクラスの順序に係るコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // サブクラスのインスタンスの生成
        Sakura sk = new Sakura();
    }
}
// スーパークラス
class Fuzi {
    // スタティックイニシャライザ
    static {
        System.out.println("スーパークラス");
    }
}
// サブクラス
class Sakura extends Fuzi {
    // スタティックイニシャライザ
    static {
        System.out.println("サブクラス");
    }
}

出力結果

スーパークラス
サブクラス

出力結果より、サブクラスのインスタンスが生成されてからのスタティックイニシャライザの実行順は、スーパークラスが先で、サブクラスが後であることが分かりました。


https://zenn.dev/goriki/articles/009-about-static

Discussion