初期化ブロック - 変数の初期化 (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 が共通して使われていることがわかります。
さて、以上、コンストラクタやら初期化ブロックやらと、いろいろと出てきましたが、 これらは一体どのような順序で呼ばれ、どう使ったらよいのでしょうか?
次の資料では、初期化の順序について説明します。