初期化ブロック - 変数の初期化 (2/3)

変数の初期化の基本については、初期化の基本 - 変数の初期化 (1/2) で説明しました。 ここでは C++ 等には存在せずに Java に特徴的な 初期化ブロック (Initialization block) について説明します。

初期化ブロックの種類

初期化ブロックには、次の二つがあります。

  • オブジェクト初期化ブロック (object initialization block)
    オブジェクト毎に実行されます。
  • 静的初期化ブロック (static initialization block)
    クラスのロード時に一度だけ実行されます。このブロックはオブジェクトが作成される前に実行されるので、static 変数のみにアクセスできます。

以上、二つについて実行例をみてみましょう。

オブジェクト初期化ブロック

オブジェクト毎に変数を初期化するには、次のように初期化ブロックを利用することもできます。

public class InitBlock1 {

     public static void main(String[] args) {
          InitBlock b = new InitBlock();
          b.printValue();
     }
}


class InitBlock {

     int x = 2;
     int y = 3;
     int z;

     // オブジェクト初期化ブロック
     {
          z = x * y;
     }

     public void printValue() {
          System.out.format( "x=%d, y=%d, z=%d", x, y, z );
     }

}

実行例は次のとおりです。

x=2, y=3, z=6

オブジェクト作成時に、オブジェクト初期化ブロックが実行されたために、変数 z が正しく 6 に初期化されていることがわかります。

静的初期化ブロック

オブジェクト毎ではなく、クラスのロード時に一度だけ変数を初期化する場合には、次のように static 付きの初期化ブロックを利用することもできます。

import java.util.Random;

public class InitBlock2 {

     public static void main(String[] args) {
          InitBlock b1 = new InitBlock();
          b1.printValue();

          InitBlock b2 = new InitBlock();
          b2.printValue();
     }


}


class InitBlock {

     static int x;
     int y;

     // 静的初期化ブロック
     static
     {
          Random gen = new Random();
          x = gen.nextInt( 100 );
     }

     // オブジェクト初期化ブロック
     {
          y = x;
          x++;
     }

     public void printValue() {
          System.out.format( "x=%d, y=%d\n", x, y );
     }

}

実行例は次のとおりです。

x=100, y=99
x=101, y=100

1行目、2行目はそれぞれ別のオブジェクトからの出力ですが、確かに x が共通して使われていることがわかります。

さて、以上、コンストラクタやら初期化ブロックやらと、いろいろと出てきましたが、 これらは一体どのような順序で呼ばれ、どう使ったらよいのでしょうか?

次の資料では、初期化の順序について説明します。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門