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