Java 入門

Java 入門 HTML 入門 CSS 入門 Excel 入門

イニシャライザ (初期化子)

Java 入門 トップページ > イニシャライザ (初期化子)

イニシャライザ (初期化子)

■ イニシャライザ(initializer)とは、クラスが初期化されたときやインスタンスが生成されたときに、その直後に変数を初期化します。何か特別な計算をした値を初期化の直後に代入したいとき等に利用します。イニシャライザ(initializer)は、クラス変数ならクラスが初期化されるときに実行され、インスタンス変数ならインスタンスが生成されたときに実行します。

■ 通常、インスタンス変数はコンストラクタで初期化できます。例えば、

class TestInitializer {
     private int[] a = new int[5];     //インスタンスフィールド int型配列a(0~4)の宣言
//コンストラクタ
     public TestInitializer() {
          for (int i = 0; i < 5; i++) {
               a[i] += i;
          }
     }
//表示するメソッド
     public void display() {
          for (int i = 0; i < 5; i++) {
               System.out.print("a[" + i + "]=" + a[i] + " ");
          }
     }
}
public class Test60 {

     public static void main(String[] args) {
          TestInitializer ti = new TestInitializer();     //TestInitializerクラスのインスタンス(ti)を生成

          ti.display();
     }
}
●実行結果(Test60.java)

a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4

■ このようにインスタンスが生成されたときに、それぞれ「a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4」で初期化されています。

スタティックイニシャライザ

■ 上記のプログラムは、インスタンス変数なのでインスタンスを生成し、コンストラクタを利用して初期化できます。ところが、クラス変数の場合はインスタンスを生成しなくても使用できるので、コンストラクタは必要ありません。クラスが初期化される直後にクラス変数を初期化したいのであれば、コンストラクタではなく「スタティックイニシャライザ(静的初期化子)」を使用します。イニシャライザを記述する箇所は、初期化の対象となるクラスフィールド宣言の後(下)であり、そのクラスのフィールドやメソッドを記述できる箇所なら記述できます。

     static {
          //ここにクラス変数を初期化する処理を記述します。
     }

■ スタティックイニシャライザ(Static Initializer)は他にも「クラス初期化子」・「静的初期化子」「静的ブロック」・「staticブロック」とも呼ばれています。

■ それでは、スタティックイニシャライザを使用したクラスを作成します。このクラスは、1つの要素に6個の要素数のpublicでstaticなフィールド、1次元配列を宣言し、スタティックイニシャライザで「10~60」を代入して表示するクラスです。このフィールドが初期化されるのは、このクラスのインスタンスを生成したり、クラスメソッドが呼び出されたり等、このクラスを利用した時に初期化は行われます。次のサンプルプログラムでは、クラスを利用した直後にスタティックイニシャライザを利用して、6個の要素数をもつ配列に「10~60」を代入します。

class Si {
     public static int[] hyaku = new int[6];     //1つの要素に6個の要素数をもつ1次元配列の宣言

//スタティックイニシャライザ(静的初期化子)
     static {
          for (int i = 0; i <= 5; i++)     //hyaku[6](0~5)に10から60を代入
               hyaku[i] = (i + 1) * 10;
     }
//表示するメソッド
     public static void display() {
          System.out.println("格納されている値を確認");
               for (int i = 0; i < Si.hyaku.length; i++) {
                    System.out.print("hyaku[" + i + "] = ");
                    System.out.println(hyaku[i]);
               }
     }
}
public class Test61 {

     public static void main(String[] args) {
          Si.display();
     }
}
●実行結果(Test61.java)

格納されている値を確認
hyaku[0] = 10
hyaku[1] = 20
hyaku[2] = 30
hyaku[3] = 40
hyaku[4] = 50
hyaku[5] = 60		

インスタンスイニシャライザ

■ インスタンスフィールドの場合、通常はコンストラクタで初期化できます。通常の初期化なら別に問題ないのですが、例えば、コンストラクタをオーバーロード(多重定義)した場合等、コンストラクタ内で同じ処理を行わなければならないときにインスタンスイニシャライザ(Instance Initializer)を利用すると便利です。

■ インスタンスイニシャライザを記述する箇所は、スタティックイニシャライザと同じで、初期化の対象となるインスタンスフィールド宣言の後(下)であり、そのクラスのフィールドやメソッドを記述できる箇所なら記述できます。実行のタイミングは、インスタンスイニシャライザが先に実行されてから、コンストラクタが実行されます。

     {
          //ここにインスタンス変数を初期化する処理を記述します。
     }

■ 次のサンプルプログラムでは、ただ数を当てるというだけのシンプルな数当てゲームを作成しました。複数の人が1~5の番号を当てるゲームです。今回はゲームの内容が3種類あり、一つの枠から1~5を当てれば当選・二つの枠からそれぞれ1~5を当てれば当選・三つの枠からそれぞれ1~5を当てれば当選といったように人によっては予想する数字の数が異なります。そのためコンストラクタを多重定義しています。今回は3種類なので少ないのですが、これが多くなると全てのコンストラクタに、順番を格納する処理と当選番号を格納する処理を記述しなければなりません。その為に一度に全てのインスタンスの初期化をインスタンスイニシャライザを使用して初期化しています。順番を示すクラスフィールドと、当選番号が格納されたインスタンスフィールド(配列)を初期化しています。

■ 今回は三つのクラスを三つのファイルにわけました。一つ目は、それぞれのプレイヤーが選んだゲームの種類の当選番号と順番を初期化して格納する「Player」クラスです。二つ目のクラスは、ゲームをスタートさせ、それぞれのプレイヤーの当たり判定をしている「GameStart」クラスです。三つ目は、それぞれのプレイヤーのインスタンスを生成するクラス「KazuateGame」です。

//playerクラス
public class Player {
     private int n1;     //一つ目の予想番号
     private int n2;     //二つ目の予想番号
     private int n3;     //三つ目の予想番号
     private int[] kuzi = new int[3];     //当選番号を格納
     private int junban;     //インスタンスが生成された順番
     private boolean kuzi1 = false;     //引数が一つか?
     private boolean kuzi2 = false;     //引数が二つか?
     private boolean kuzi3 = false;     //引数が三つか?
     private static int counter;     //順番をカウント
//インスタンスイニシャライザ
     {
          junban = ++counter;
          for (int i = 0; i < kuzi.length; i++)
               kuzi[i] = (int) (1 + 5 * Math.random());
     }
//コンストラクタ(引数一つ)
     public Player(int n1) {
          this.n1 = n1;
          kuzi1 = true;
     }
//コンストラクタ(引数二つ)
     public Player(int n1, int n2) {
          this.n1 = n1;
          this.n2 = n2;
          kuzi2 = true;
     }
//コンストラクタ(引数三つ)
     public Player(int n1, int n2, int n3) {
          this.n1 = n1;
          this.n2 = n2;
          this.n3 = n3;
          kuzi3 = true;
     }
//メソッド(順番を取得)
     public int getJunban() {
          return junban;
     }
//メソッド(プレイヤーの一つ目の予想番号)
     public int getN1() {
          return n1;
     }
//メソッド(プレイヤーの二つ目の予想番号)
     public int getN2() {
          return n2;
     }
//メソッド(プレイヤーの三つ目の予想番号
     public int getN3() {
          return n3;
     }
//メソッド(一つ目の当選番号)
     public int getKuzi_0() {
          return kuzi[0];
     }
//メソッド(二つ目の当選番号)
     public int getKuzi_1() {
          return kuzi[1];
     }
//メソッド(三つ目の当選番号)
     public int getKuzi_2() {
          return kuzi[2];
     }
//メソッド(引数一つのコンストラクタを使用したプレイヤーを取得)
     public boolean getKuzi1() {
          return kuzi1;
     }
//メソッド(引数二つのコンストラクタを使用したプレイヤーを取得)
     public boolean getKuzi2() {
          return kuzi2;
     }
//メソッド(引数三つのコンストラクタを使用したプレイヤーを取得)
     public boolean getKuzi3() {
          return kuzi3;
     }
}
//GameStartクラス
public class GameStart {
//ゲームをスタートさせ、表示と判定をするメソッド
     public void start(Player ply) {
          int ply1 = ply.getN1();     //一つ目の予想番号
          int ply2 = ply.getN2();     //二つ目の予想番号
          int ply3 = ply.getN3();     //三つ目の予想番号
          boolean plykuzi1 = ply.getKuzi1();     //予想番号が一つ
          boolean plykuzi2 = ply.getKuzi2();     //予想番号が二つ
          boolean plykuzi3 = ply.getKuzi3();     //予想番号が三つ
//予想番号が一つなら実行
          if (plykuzi1 == true) {
               System.out.println();
               System.out.println("【" + ply.getJunban() + "】番目の方");
               System.out.println("当選番号《" + ply.getKuzi_0() + "》");
               if (ply1 == ply.getKuzi_0()) {
                    System.out.println("あなたの番号は『" + ply.getN1() + "』で当たり!!");
               } else {
               System.out.println("あなたの番号[" + ply.getN1() + "]ではずれ");
          }
     }
//予想番号が二つなら実行
          if (plykuzi2 == true) {
               System.out.println();
               System.out.println("【" + ply.getJunban() + "】番目の方");
               System.out.println("当選番号《" + ply.getKuzi_0() + "》と《" + ply.getKuzi_1() + "》");
               if (ply1 == ply.getKuzi_0() && ply2 == ply.getKuzi_1()) {
                    System.out.println("あなたの番号『" + ply.getN1() + "』と『" + ply.getN2() + "』で当たり!!");
               } else {
                    System.out.println("あなたの番号[" + ply.getN1() + "]と[" + ply.getN2() + "]ではずれ");
               }
          }
//予想番号が三つなら実行
          if (plykuzi3 == true) {
               System.out.println();
               System.out.println("【" + ply.getJunban() + "】番目の方");
               System.out.println("当選番号《" + ply.getKuzi_0() + "》と《" + ply.getKuzi_1() + "》と《" + ply.getKuzi_2() + "》");
               if (ply1 == ply.getKuzi_0() && ply2 == ply.getKuzi_1() && ply3 == ply.getKuzi_2()) {
                    System.out.println("あなたの番号『" + ply.getN1() + "』と『" + ply.getN2() + "』と『" + ply.getN3() + "』で当たり!!");
               } else {
                    System.out.println("あなたの番号[" + ply.getN1() + "]と[" + ply.getN2() + "]と[" + ply.getN3() + "]ではずれ");
               }
          }
     }
}
//KazuateGameクラス
public class KazuateGame {

     public static void main(String[] args) {
          GameStart gs = new GameStart();
          Player a = new Player(1, 2, 3);
          Player b = new Player(5);
          Player c = new Player(2, 1);
          Player d = new Player(1);
          Player e = new Player(4, 4);
          Player f = new Player(3, 2, 1);

          gs.start(a);
          gs.start(b);
          gs.start(c);
          gs.start(d);
          gs.start(e);
          gs.start(f);
     }
}
●実行結果(KazuateGame.java)

【1】番目の方
当選番号《4》と《4》と《2》
あなたの番号[1]と[2]と[3]ではずれ

【2】番目の方
当選番号《5》
あなたの番号は『5』で当たり!!

【3】番目の方
当選番号《5》と《3》
あなたの番号[2]と[1]ではずれ

【4】番目の方
当選番号《5》
あなたの番号[1]ではずれ

【5】番目の方
当選番号《2》と《1》
あなたの番号[4]と[4]ではずれ

【6】番目の方
当選番号《3》と《2》と《1》
あなたの番号『3』と『2』と『1』で当たり!!

アクセス数

カウンター数字

Java 入門

HTML 入門

CSS 入門

JavaScript 入門

JavaScript リファレンス

Excel

サイトマップ

お問合せフォーム

Java 書籍

自己紹介

被リンクについて

Web タイピング練習

Valid HTML 4.01 Strict