Java コンストラクタの多重定義(オーバーロード)

コンストラクタは、
メンバ関数のように多重定義(オーバーロード)が可能です。

メンバ関数の多重定義(オーバーロード)についてはコチラ

コンストラクタの使用例

public class Cmain {

      public static void main(String[] args) {
            // 引数なしのコンストラクタ呼び出し
            Cdata obj = new Cdata();

            // 引数が1つののコンストラクタ呼び出し
            Cdata obj1 = new Cdata(10);

            // 引数が2つののコンストラクタ呼び出し
            Cdata obj2 = new Cdata(10, 50);

            // 引数が3つののコンストラクタ呼び出し
            Cdata obj3 = new Cdata(10, 50, 100);
      }
}

class Cdata {
      public int a;
      public int b;
      public int c;

      // コンストラクタ
      public Cdata() {
            a = 0;
            b = 0;
            c = 0;
      }

      // 引数が1つのコンストラクタ
      public Cdata(int data1) {
            a = data1;
            b = 0;
            c = 0;
      }

      // 引数が2つのコンストラクタ
      public Cdata(int data1, int data2) {
            a = data1;
            b = data2;
            c = 0;
      }

      // 引数が3つのコンストラクタ
      public Cdata(int data1, int data2, int data3) {
            a = data1;
            b = data2;
            c = data3;
      }
}

この例では、クラスCdataのコンストラクタを複数作成した例です。

それぞれ、引数なし、引数1,2,3個のコンストラクタが
多重定義(オーバーロード)されています。

それぞれのコンストラクタの呼び出し方は、
実際にクラスのインスタンスを作る時に、
インスタンス名の後ろにカッコをつけて、
関数のように引数を記述します。

引数を指定しなかった場合、
引数なしのコンストラクタが呼び出されます。

引数を1つ指定した場合は、
引数1個のコンストラクタが呼び出されます。

それぞれ2個、3個の場合も同様。

コンストラクタ内から別のコンストラクタを呼び出す

上記の例では、
似たような処理を4つのコンストラクタで記述しましたが、
もう少し短く記述する事が可能です。

そのためには、
コンストラクタ内から別のコンストラクタを呼び出します。

public class Cmain {

      public static void main(String[] args) {
            // 引数なしのコンストラクタ呼び出し
            Cdata obj = new Cdata();

            // 引数が1つののコンストラクタ呼び出し
            Cdata obj1 = new Cdata(10);

            // 引数が2つののコンストラクタ呼び出し
            Cdata obj2 = new Cdata(10, 50);

            // 引数が3つののコンストラクタ呼び出し
            Cdata obj3 = new Cdata(10, 50, 100);
      }
}

class Cdata {

      public int a;
      public int b;
      public int c;

      // コンストラクタ
      public Cdata() {
            this(0, 0, 0); // 引数3つのコンストラクタ呼び出し
      }

      // 引数が1つのコンストラクタ
      public Cdata(int data1) {
            this(data1, 0, 0);
      }

      // 引数が2つのコンストラクタ
      public Cdata(int data1, int data2) {
            this(data1, data2, 0);
      }

      // 引数が3つのコンストラクタ
      public Cdata(int data1, int data2, int data3) {
            a = data1;
            b = data2;
            c = data3;
      }
}

このプログラム例では、
コンストラクタ内で別のコンストラクタを呼び出した例です。

別のコンストラクタを呼び出すには、
this();のように記述します。

thisは、自分自身を指す参照を表すので、
こう言った記述が可能になります。

コンストラクタ内で
重複した記述が目立つ場合には有効な記述方法ですので、
ぜひ、活用して下さい。

ただし、このthisを使ったコンストラクタの呼び出しは、
コンストラクタの先頭行に記述しなくてはならない

というJava言語のルールがありますので、注意して下さい。