1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-05-09

はじめに

こんにちは。
プログラミング初心者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)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?