Java

static初期化ブロック(staticイニシャライザ)とは?Java初心者の勉強

Java icon

Javaの資格の勉強をしていたらstatic初期化ブロックというものがあることを知りました。使い方をマスターしたいと思います。

初期化ブロックについては前回書いたのでそちらも合わせて読んでいただければと思います。

static初期化ブロックとは?

名前からもわかるようにstaticフィールドの初期化を行います。クラスを利用する際に一度だけ呼び出されます。
めったに使われることはないようですが大量のstaticな値を使用する際の初期化に便利です。
static初期化ブロックはstaticイニシャライザとも呼ばれます。

構文

public class test{
    static {
    // 処理
    }
}

static初期化ブロックのルール

static初期化ブロックは複数記述できる
クラスロード時にスタティックイニシャライザが実行される

サンプルコード

static初期化ブロックの理解を深めるためのサンプルコードをつくってみました。(ちょっと多め。)

static初期化ブロックを使ってみる サンプルコード

public class Main {
    public static void main(String[] args) {
        System.out.println(Test.num);
    }
}

public class Test {
    public static int num;
    static{
        num = 10;
    }
}

結果

10

値が決まっていれば設定しておけば便利かもしれないですね。

static初期化ブロックの実行の順番

public class Main {
    static int num;
    static{
        System.out.println(“Mainクラスstatic初期化ブロック”);
        num = 10;
    }
    public static void main(String[] args) {
        System.out.println(“mainメソッド”);
        System.out.println(num + ” ” + Test.str);
    }
}

public class Test {
    static String str;
    static{
        System.out.println(“Testクラスstatic初期化ブロック”);
        str = “Hello”;
    }
}

結果

Mainクラス static初期化ブロック
mainメソッド
Testクラス static初期化ブロック
10 Hello

クラスが呼び出されるとstatic初期化ブロックも実行されます。

static初期化ブロックを複数書いてみる サンプルコード

public class Main {
    static int num;
    static String str;
    static{
        System.out.println(“1つめ”);
        num = 10;
        str = “Hello”;
    }
    static{
        System.out.println(“2つめ”);
        num = 100;
    }
    public static void main(String[] args) {
        System.out.println(num + ” ” + str);
    }
}

結果

1つめ
2つめ
100 Hello

static初期化ブロックは複数書くことが可能です。フィールドはあとから実行された初期化ブロックで上書きされます。

static初期化ブロックは一度しか実行されない サンプルコード

public class Test {
    static int num;
    static {
        System.out.println(“staticイニシャライザが実行されました”);
        num = (int) (Math.random() * 3);
    }
    void play() {
        String[] str = {“グー”, “チョキ”, “パー”};
        System.out.println(“playメソッド”);
        System.out.println(str[num]);
    }
    public static void main(String[] args) {
        Test obj1 = new Test();
        System.out.println(“obj1のじゃんけん”);
        obj1.play();
        Test obj2 = new Test();
        System.out.println(“obj2のじゃんけん”);
        obj2.play();
    }
}

結果 (一例)

staticイニシャライザが実行されました
obj1のじゃんけん
playメソッド
パー
obj2のじゃんけん
playメソッド
パー

最初に一度staticイニシャライザが呼ばれた後は実行されず。

初期化メソッド(インスタンスイニシャライザ)との違い サンプルコード

public class Test {
    int num;
    static String[] str = new String[3];
    static {
        System.out.println(“staticイニシャライザが実行されました”);
        str[0] = “グー”;
        str[1] = “チョキ”;
        str[2] = “パー”;
    }
    {
        System.out.println(“インスタンスイニシャライザが実行されました”);
        num = (int) (Math.random() * 3);
    }
    void play() {
        System.out.println(“playメソッド”);
        System.out.println(str[num]);
    }
    public static void main(String[] args) {
        Test obj1 = new Test();
        System.out.println(“obj1のじゃんけん”);
        obj1.play();
        Test obj2 = new Test();
        System.out.println(“obj2のじゃんけん”);
        obj2.play();
    }
}

結果 (一例)

staticイニシャライザが実行されました
インスタンスイニシャライザが実行されました
obj1のじゃんけん
playメソッド
グー
インスタンスイニシャライザが実行されました
obj2のじゃんけん
playメソッド
チョキ

インスタンスイニシャライザはインスタンス生成されるたびに実行されています。

おわり

あまり使われないみたいですが、ここまで学んだのだからどこかで使ってみたいですね。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です