第5章 オーバーロード

5.2 コンストラクタから別のコンストラクタを呼ぶ

オーバーロードして複数のコンストラクタを定義した場合、あるコンストラクタの処理内から別定義のコンストラクタを呼び出して使用できる特殊な利用方法があります。
使用方法については以下のような制約があります。

  • 呼び出す場合の名前は、必ずthis(引数,…)とする。
  • 呼び出す場合の記述位置は、必ず処理内の先頭に記述する

まずは別のコンストラクタを呼び出すための基本構文を以下に示します。

書式:コンストラクタ処理内から別のコンストラクタ呼び出し

※以下の書式は、引数なしのコンストラクタと引数2つのコンストラクタを定義している場合の例で、引数が2つのコンストラクタ内で引数なしのコンストラクタを呼び出しています。

凡例:コンストラクタ処理内から別のコンストラクタ呼び出し(引数あり→引数なしの場合)

次の項でコンストラクタから別のコンストラクタが呼び出して動作するサンプルを紹介していきます。

5.2.1 コンストラクタから別のコンストラクタを呼び出すプログラム

オブジェクト生成する際に、コンストラクタから別のコンストラクタが呼び出されていることを確認します。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch05
③ 名前: NestedConstructor
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch05;

  class Computer4 {
    private String os;
    private int memory;

    // 引数なしコンストラクタ
    public Computer4() {
      this.os = null;
      this.memory = 0;
      System.out.println("パソコンを作成しました。");
    }
    // 引数2つもつコンストラクタ
    public Computer4(String os, int memory) {
      // 引数なしのコンストラクタ呼び出し
      this();
      this.os = os;
      this.memory = memory;
      System.out.println("OS「" + os + "」メモリサイズ" + "「" + memory
        + "MByte」のパソコンを作成しました。");
    }
    public void show() {
      System.out.println("パソコンのOSは「" + os + "」です。");
      System.out.println("メモリサイズは「" + memory + "MByte」です。");
    }
  }
  public class NestedConstructor {
    public static void main(String[] args) {
      // オブジェクト生成
      Computer4 com = new Computer4("WindowsXP", 2048);
      com.show();
    }
  }
  
実行結果

解説
Computer4クラス内では引数を2つのコンストラクタの処理内の先頭で「this();」とし、引数なしのコンストラクタを呼び出す記述を行っています。

30行目では引数2つを与えてオブジェクトの生成を行っています。その後31行目のshowメソッドを呼び出しフィールド変数の値を画面に出力しています。main処理内では引数2つのコンストラクタでオブジェクト生成のみを行っていますが、実行結果からも分かるように「パソコンを作成しました。」というメッセージが出力されています。これは引数なしコンストラクタの処理が行われないと出力されないメッセージです。結果として正しく引数2つのコンストラクタより引数なしのコンストラクタが呼び出されていることが確認できます。

ポイント
  • コンストラクタをオーバーロード機能で複数定義している場合、あるコンストラクタから別のコンストラクタを呼び出すことができる。但し無限ループになるような呼び出し方にならないように注意する。

NEXT>> 5.3 本章のまとめ