🤖

Javaの「staticイニシャライザ」をざっくりまとめてみた[Java初心者]

に公開

はじめに

こんにちは。
プログラミング初心者Wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。

十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
間違い等あれば、指摘いただけると助かります。

対象読者

  • Javaを勉強中の方
  • Java Silver試験を勉強中の方
  • Javaのstaticイニシャライザをざっくり知りたい方

目次

1.「staticイニシャライザ」とは
2. クラスロード時の実行順番
3.「staticイニシャライザ」と「コンストラクタ」との違い

本文

1. 「staticイニシャライザ」とは

「staticイニシャライザ」は静的メンバの一つで、クラスがロードされたタイミングに1度だけ実行されるブロックです。クラスロード時に自動で実行したい処理がある場合に用いられます。
「staticイニシャライザ」は、「static初期化子」「static初期化ブロック」とも呼ばれます。

「staticイニシャライザ」を使う場合、staticキーワードと波括弧ブロックでコードを記述します。
具体的なコードは以下の通りです。

class Test {

  static {
    System.out.println("staticイニシャライザ起動"); 
  }
  
}

2. クラスロード時の実行順番

「staticイニシャライザ」は複数書くことができます。
静的フィールドの初期化と「staticイニシャライザ」が複数ある場合は、上から順番に実行されます。

class Test {
  static int num = 10;  //①②
  static {
    System.out.println("staticイニシャライザ1を実行"); //③
  }
  static {
    System.out.println("staticイニシャライザ2を実行"); //③
  }
  static String name = "Taro"; //①④
}

上のコードの場合、クラスロードの時の内部処理は、以下の順番で行われます。

①静的フィールドnumとnameにデフォルト値を代入
②静的フィールドnumに初期化値を10を代入
③「staticイニシャライザ1」を実行
④「staticイニシャライザ2」を実行
⑤静的フィールドnameに初期化値"Taro"を代入

3. 「staticイニシャライザ」と「コンストラクタ」

初期化に用いられる似たようなものとして「コンストラクタ」があります。
「staticイニシャライザ」と「コンストラクタ」では、実行タイミングと操作対象が異なります。

「コンストラクタ」の実行タイミングは、インスタンス生成時です。インスタンスフィールドの初期化など、インスタンス生成時に実行したい処理を記述します。

一方の「staticイニシャライザ」の実行タイミングは、クラスロード時です。クラスロード時に実行したい処理を記述します。また、静的メンバがインスタンスメンバにアクセスできないのと同様に、「staticイニシャライザ」もインスタンスメンバにアクセスでません。「staticイニシャライザ」内にインスタンスメンバやthis参照を記述すると、コンパイラエラーとなります。

では、それぞれの実行タイミングをコードで見ていきましょう。
以下のコードをご覧ください。

class Test {
  static{
    System.out.println("Testクラスのstaticイニシャライザ"); //③
  }
  Test(){
    System.out.println("Testクラスのコンストラクタ"); //④
  }
}

public class Main { 
  static{
    System.out.println("Mainクラスのstaticイニシャライザ"); //①
  }
  public static void main(String[] args){
    System.out.println("Mainクラスのmainメソッド");  //②
    Test obj = new Test();
  }
}

TestクラスとMainクラス、それぞれにstaticイニシャライザが記述されています。
上のコードを実行すると、以下の結果となります。

Mainクラスのstaticイニシャライザ //①
Mainクラスのmainメソッド //②
Testクラスのstaticイニシャライザ //③
Testクラスのコンストラクタ //④

まとめ

  • 「staticイニシャライザ」はクラスロード時に一度だけ実行されるブロックです
  • 「staticイニシャライザ」は複数書くことができ、上から順番に実行されます
  • 「staticイニシャライザ」と「コンストラクタ」は、実行されるタイミングと操作対象が異なります

記事は以上です。
最後までお読みいただき、ありがとうございました。

参考情報一覧

この記事は以下の情報を参考にして執筆しました。

  • [オラクル認定資格教科書 JavaプログラマSilverSE11]
  • [パーフェクトJava 改訂3版]
  • [8.1 スタティックなメンバー(スタティックフィールド、スタティックメソッド、ユーティリティ、クラスのライフサイクルなど)~Java Basic編](最終更新 2023-11-05)(https://qiita.com/KenyaSaitoh/items/10e7abd3b38724975a03) (参照 2025-05-09)
GitHubで編集を提案

Discussion