Java入門18 コンストラクタをオーバーロードする

Java入門の第18回です。前回からの続きですが、今回だけでも分かる内容になっています。このシリーズの第1回はこちらです。

今回は、オーバーロードについて解説します。オーバーロードとは、メソッドやコンストラクタを同じ名前で複数作成することです。

オーバーロードとは

オーバーロードとは、メソッドやコンストラクタを同じ名前で複数作成することです。

ひとつのクラスの中に、同じメソッド名やコンストラクタ名が存在してはいけないように思うかもしれませんが、Javaプログラミングでは同じ名前のメソッドやコンストラクタを作成することができます。

ただし、引数の有り無し、引数の数や型によって、同じ名前であってもメソッドやコンストラクタの区別がつくようにしてやる必要があります。

コンストラクタをオーバーロードしている実例

実例で確認しましょう。以下のコードでは、Point()メソッドという同じ名前のコンストラクタが2つあります。

ただし、一方には引数が無く、もう一方には引数があるので、同じ名前のコンストラクタでも区別することはできます。

class Point {
    int x;
    int y;
    //コンストラクタ1
    Point() {
        this.x = 0;
        this.y = 0;
    }
    //コンストラクタ2
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //インスタンスメソッド
    void printZahyo() {
        System.out.println(this.x + "," + this.y);
    }
}

public class Test21 {
    public static void main(String[] args) {
        //配列を用意する
        Point[] zahyos = new Point[3];
        //インスタンスを生成
        zahyos[0] = new Point(3, 5);
        zahyos[1] = new Point();
        zahyos[2] = new Point();
        //インスタンスメソッドを呼び出す
        zahyos[0].printZahyo();
        zahyos[1].printZahyo();
        zahyos[2].printZahyo();
    }
}

上記コードには、コンストラクタが2つ作成されています。いわゆるコンストラクタをオーバーロードしている状態ですが、決して誤ったコードというわけではありません。

2つのコンストラクタは、Point()とPoint(int x, int y)で同じ名前ですが、引数の有無によってどちらのコンストラクタが実行されるのか区別することができます。

もし引数が無い場合にはPoint() が実行されます。この場合、初期値としてxとyには0が代入されます。一方、引数として2つの整数を持っている場合にはPoint(int x, int y)が実行されます。この場合、xとyには指定された引数の値が代入されます。

上記コードの実行結果は、以下の通りです。

3,5
0,0
0,0

1つ目の座標は、 new Point(3, 5) と引数を指定してインスタンスを生成しているので、Point(int x, int y)の方のコンストラクタが実行されて座標の値は 3, 5となっています。

2つ目と3つ目の座標は、 new Point()と引数無しでインスタンスを生成しているので、Point()の方のコンストラクタが実行されて座標の値は 0, 0となっています。

以下は、上記コードをEclipseで実行した結果画面です。

まとめ

  • オーバーロードとは、メソッドやコンストラクタを同じ名前で複数作成することです。
  • Javaプログラミングでは同じ名前のメソッドやコンストラクタを作成することができ、オーバーロードは誤ったコードではありません。
  • ただし、引数の有無や引数の数や型によってそれぞれの区別がつくようにしてやる必要があります。
  • 同じ名前のメソッドやコンストラクタをオーバーロードして、引数で処理を分けることで、プログラムをより柔軟に作成できます。

次回へ続きます。