初期化ブロック


Javaの初期化ブロックとstatic初期化ブロックの使い方と実行順序の紹介です。

🚕 初期化ブロック

初期化ブロックを使うとオブジェクトの初期化を行うことができます。

import java.util.Date;
public class Sample {
private final Date date;
{
System.out.println("初期化ブロックの実行");
date = new Date();
}
public Date getDate() {
return this.date;
}
public static void main(String[] args) {
Sample sample = new Sample();
System.out.println(sample.getDate().toString());
}
}

実行結果は次のとおりです。

初期化ブロックの実行
Sat Apr 22 09:20:20 JST 2017

初期化ブロックとコンストラクタの役割はほぼ同じですが、初期化ブロックの特徴は次のとおりです。

  • すべてのコンストラクタの共通処理を記述可能
  • 匿名クラスの初期化に使用(匿名クラスにはコンストラクタがないため)
Map<String, String> map = new HashMap<String, String>() {
{
put(key1, value1);
put(key2, value2);
}
}

🐹 static初期化ブロック

static初期化ブロックを使うと、クラスの初期化時に実行できます。

import java.util.Date;
public class Sample {
private static final Date date;
static {
System.out.println("static 初期化ブロックの実行");
date = new Date();
}
public static void main(String[] args) {
System.out.println(date.toString());
}
}

実行結果は次のようになります。

static 初期化ブロックの実行
Sat Apr 22 09:33:38 JST 2017

🐯 初期化の順序

初期化ブロックやコンストラクタなどの初期化処理は次の順序で実行されます。

  1. フィールド変数へのデフォルト値の代入
  2. static初期化ブロックを親クラス(上)から順に実行
  3. 初期化ブロックを親クラス(上)から順に実行
  4. コンストラクタの呼び出し
class SuperClass {
static {
System.out.println(SuperClassのstatic初期化ブロック);
}
{
System.out.println(SuperClassの初期化ブロック);
}
public SuperClass() {
System.out.println(SuperClassのコンストラクタ);
}
}
class ChildClass extends SuperClass {
static {
System.out.println(ChildClassのstatic初期化ブロック);
}
{
System.out.println(ChildClassの初期化ブロック);
}
public ChildClass() {
System.out.println(ChildClassのコンストラクタ);
}
public static void main(String[] args) {
ChildClass child = new ChildClass();
System.out.println(mainメソッドの実行);
}
}

実行結果は次のようになります。

SuperClassのstatic初期化ブロック
ChildClassのstatic初期化ブロック
SuperClassの初期化ブロック
SuperClassのコンストラクタ
ChildClassの初期化ブロック
ChildClassのコンストラクタ
mainメソッドの実行

👽 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍