初期化ブロックの使い方について調べてみました。
初期化ブロックとは?
コンストラクタがオーバーロードされて複数あるときに共通の処理を行う際に使えるのが初期化ブロックです。
初期化ブロックは中カッコ「{}」で囲んだブロックのことを示します。
インスタンスイニシャライザとも呼ばれます。英語で書くとInstance Initializer Blockとなります。
構文
public class test{
{
// 初期化ブロックの処理
}
}
初期化ブロックのルール
- コンストラクタが実行される前に初期化ブロックは実行される
- 初期化ブロックは複数あっても良い
サンプルコード
使い方がいまいちよくわかっていないのでサンプルコードで動きを確認したいと思います。
初期化ブロックを使ってみる サンプルコード
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test(“test2”);
System.out.println(test1.name + ” ” + test1.num);
System.out.println(test2.name + ” ” + test2.num);
}
}
public class Test {
int num;
String name;
// コンストラクタ
public Test(){
name = “test1”;
}
// コンストラクタ
public Test(String name){
this.name = name;
}
// 初期化ブロック
{
num = 10;
}
}
結果
test1 10
test2 10
初期化ブロックで設定した数値がオーバーロードされたどちらのコンストラクタでも設定されていることがわかります。
初期化ブロックの実行の順番を確認する サンプルコード
System.out.println()を使って文字を出力し実行される順番を確認してみます。
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test(“test2”);
System.out.println(test1.name + ” ” + test1.num);
System.out.println(test2.name + ” ” + test2.num);
}
}
public class Test {
int num;
String name;
// コンストラクタ
public Test(){
name = “test1”;
System.out.println(“コンストラクタ1が実行されました”);
}
// 初期化ブロック
{
num = 10;
System.out.println(“初期化ブロックが実行されました”);
}
// コンストラクタ
public Test(String name){
this.name = name;
System.out.println(“コンストラクタ2が実行されました”);
}
}
結果
初期化ブロックが実行されました
コンストラクタ1が実行されました
初期化ブロックが実行されました
コンストラクタ2が実行されました
test1 10
test2 10
初期化ブロックを記述した位置とは関係なくコンストラクタが呼び出された時は、まず初期化ブロックが実行されることがわかります。
初期化ブロックを実施した後にコンストラクタで値を変更することも可能です。
初期化ブロックを複数書いてみる サンプルコード
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test(“test2”);
System.out.println(test1.name + ” ” + test1.num1 + ” ” + test1.num2);
System.out.println(test2.name + ” ” + test2.num1 + ” ” + test2.num2);
}
}
public class Test {
int num1;
int num2;
String name;
// コンストラクタ
public Test(){
name = “test1”;
}
// 初期化ブロック
{
num1 = 10;
}
// コンストラクタ
public Test(String name){
this.name = name;
}
// 初期化ブロック
{
num2 = 100;
}
}
結果
test1 10 100
test2 10 100
初期化ブロックを複数にわけてもコンパイルエラーは発生しません。
おわり
初期化ブロックを使うほどの機会にはまだ出会ってはいませんが、オーバーロードする数が多ければ便利な機能ですね。