コンストラクタのオーバーロード

クラスでは、引数の数やデータ型が異なるコンストラクタを複数定義することができます。このように複数のコンストラクタを定義することをコンストラクタのオーバーロードといいます。複数のコンストラクタがある場合、オブジェクトの作成時に指定した引数に応じて自動的に呼び出されるコンストラクタが決まります。ここではオブジェクト指向におけるコンストラクタのオーバーロードの使い方について解説します。

コンストラクタのオーバーロード

クラスでは、複数のコンストラクタを定義することができます。引数の数や型が異なるコンストラクタを同じクラスの中に複数用意することを、コンストラクタのオーバーロードといいます。

class クラス名 {
  クラス名(){
    // 引数がないコンストラクタ
  }

  クラス名(引数の型 変数){
    // 引数が1つのコンストラクタ
  }

  クラス名(引数の型 変数, 引数の型 変数){
    // 引数が2つのコンストラクタ
  }
}

引数の数が同じでも、データ型が異なっていればそれぞれコンストラクタを定義できます。下記の 2 つのコンストラクタは引数の数は同じですが、引数のデータ型が異なるためそれぞれ定義することができます。

class クラス名 {
  クラス名(int 変数){
    // int型の引数を取るコンストラクタ
  }

  クラス名(String 変数){
    // String型の引数を取るコンストラクタ
  }
}

複数のコンストラクタが定義されている場合、オブジェクトを作成するときに指定した引数の内容によって、呼び出されるコンストラクタが自動的に選択されます。

クラス名 o1 = new クラス名();
クラス名 o2 = new クラス名(引数);
クラス名 o3 = new クラス名(引数1, 引数2);

このように引数が異なるコンストラクタを複数定義しておくことで、オブジェクトの作成方法を複数用意することができます。

コンストラクタのオーバーロードの例

実際の例を見てみます。次の Product クラスでは、引数のないコンストラクタと、引数を 2 つ受け取るコンストラクタを定義しています。

class Product {
  private int price;
  private String name;

  // 引数のないコンストラクタ
  public Product() {
    price = 0;
    name = "未設定";
  }

  // 引数のあるコンストラクタ
  public Product(int newprice, String newname) {
    price = newprice;
    name = newname;
  }
}

このクラスでは、オブジェクトを作成する方法を次のように 2 通り用意することができます。

Product p1 = new Product();
Product p2 = new Product(100, "りんご");

最初の例では引数が指定されていないため、引数のないコンストラクタが呼び出されます。 2 つ目の例では引数が指定されているため、引数を 2 つ受け取るコンストラクタが呼び出されます。

オーバーロードの条件

コンストラクタをオーバーロードする場合、引数の数または引数の型が異なっている必要があります。

Product()
Product(int price)
Product(String name)
Product(int price, String name)

このように引数が異なっていれば、同じクラス内に複数のコンストラクタを定義することができます。引数の数が同じでもデータ型が異なっていれば問題ありません。

もし引数の数や型が同じコンストラクタを複数定義するとコンパイルエラーになります。また引数名だけが異なっているコンストラクタも定義できません。

引数名だけが異なるコンストラクタは定義できない。
Product(int price)
Product(int stock)

では簡単なサンプルを使ってオブジェクト作成時の引数に応じて、対応するコンストラクタが呼び出されることを確認してみます。テキストエディタで次のように記述したあと、 Sample.java という名前で保存します。

public class Sample {
  public static void main(String[] args) {
    Product p1 = new Product();
    Product p2 = new Product(100);
    Product p3 = new Product("オレンジ");
    Product p4 = new Product(80, "バナナ");
  }
}

class Product {
  private int price;
  private String name;

  public Product() {
    price = 0;
    name = "未設定";
    System.out.println("引数のないコンストラクタが呼び出されました");
  }

  public Product(int newprice) {
    price = newprice;
    name = "未設定";
    System.out.println("引数が1つ(int)のコンストラクタが呼び出されました");
  }

  public Product(String newname) {
    price = 0;
    name = newname;
    System.out.println("引数が1つ(String)のコンストラクタが呼び出されました");
  }

  public Product(int newprice, String newname) {
    price = newprice;
    name = newname;
    System.out.println("引数が2つのコンストラクタが呼び出されました");
  }
}

コンパイルを行います。

javac -encoding UTF-8 Sample.java

その後で、次のように実行してください。

java Sample

オーバーロードの条件(1)

引数の数やデータ型が異なる 4 つのコンストラクタを用意しました。 new によってオブジェクトが作成されるきに指定された引数によって、対応するコンストラクタが自動的に呼び出されているのが確認できます。

-- --

オブジェクト指向におけるコンストラクタのオーバーロードの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。