インスタンス初期化子

クラスメソッドがあって、インスタンスメソッドがある。
クラス変数があって、インスタンス変数がある。
ということで、クラス初期化子があるので、インスタンス初期化子もあるわけ。
クラス初期化子 - rderaログのHello.javaをちょっと変更して利用。

  1 public class Hello {
  2   //フィールド
  3   
  4   
  5   //コンストラクタ
  6   
  7   
  8   //インスタンス初期化子
  9   {
 10     System.out.println("Hello World");
 11   }
 12   
 13   
 14   //メソッド
 15 
 16 }
  1 public class HelloTest {
  2   
  3   public static void main(String[] args) {
  4     Hello hello  = new Hello();
  5     Hello hello2 = new Hello();
  6     Hello hello3 = new Hello();
  7   }
  8   
  9 } 

実行結果

$ javac Hello.java
$ javac HelloTest.java
$ java HelloTest
Hello World
Hello World
Hello World

インスタンス初期化子が実行されるタイミング

コンストラクタ呼び出し→ココ!!→コンストラクタ本体実行開始

ココ!!です。

クラス初期化子との違い

staticと書かない。
初期化子が実行されるのは一度限りではない。
インスタンス化して、コンストラクタが実行される度に初期化される。

どのように便利か。

例えば、クラス内でコンストラクタを多重定義しています。
そのような場合、コンストラクタ内で共通に行う処理をインスタンス初期化子に書いておけば、同じコードを書く必要もなくなります。また、スペルミスも回避できます。

class Hoge {
  //フィールド

  //インスタンス初期化子
  {
    //共通で行う処理
  }

  //コンストラクタ
  Hoge()          { }
  Hoge(...)       { }
  Hoge(......)    { }
  Hoge(.........) { }

}