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

Javaでは,引数のパターンが異なる,同じ名称のメソッドを定義することができることについては,既に学習した.これをオーバーロードと呼ぶ.このことは,コンストラクタでもおなじである.クラスと結びつきが強いメソッドであるコンストラクタでも,同じ名称,すなわち,クラス名をメソッド名として,引数が異なるメソッドを定義できる.

ここでは,スタックサイズを指定してインスタンス化するためのコンストラクタを定義する.引数として,作成したいスタックのサイズを指定できるようにする.

class Stack
{
    int volume;
    int data[];
    static int defaultSize = 5;
//標準サイズのためのコンストラクタ Stack() { data = new int[defaultSize]; System.out.println(data.length + "個分のスタック生成"); }
//サイズ指定できるコンストラクタ Stack(int stackSize) { data = new int[stackSize]; System.out.println(data.length + "個分のスタック生成"); }
//データ追加メソッド boolean push(int number) { if(volume < data.length) { data[volume] = number; volume++; return true; } else { System.out.println("stack overflow"); return false; } }
//データ取得メソッド int pop() { int value; if(volume > 0) { value = data[volume -1]; data[volume -1] = 0; volume--; } else { value = -1; } return value; }
//状態表示メソッド void printStack() { System.out.print("|"); for(int i=0; i < data.length; i++) { System.out.print(data[i]); System.out.print("|"); } System.out.println(""); }
//個別の状態表示メソッド void printStack(int i) { System.out.print("|"); System.out.print(data[i]+"|"); System.out.println(""); } }
class Main
{
    public static void main(String[] args)
    {
        Stack tower = new Stack();
        System.out.println("スタックサイズは" + tower.data.length);
        Stack tower10 = new Stack(10);
        System.out.println("スタックサイズは" + tower10.data.length);
    }
}

実行例

5個分のスタック生成
スタックサイズは5
10個分のスタック生成
スタックサイズは10

同じ名前を付けるコンストラクタである故,引数が異なっても,同じような処理が含まれていることが往々にしてある.別々に定義すると,内容が重複する部分が発生する.上で定義した2件のメソッドも,ただ大きさが異なるだけで,他は同じであるので,同じ命令や類似する命令が含まれている.このようなことを少なくするために,同じメソッドを上手く利用する.

コンストラクタの時には,他のコンストラクタを上手く使ってやればよい.この時に便利なキーワードが「this」である.thisは,自分自身のクラスを意味する.Stackクラスでいうと,thisがStackを意味するので,「this(●●)」というメソッドは「Stack(●●)」というメソッドを意味する.これを利用して,重複処理を最低限にしてみると,次のようにコンストラクタを定義することができる.

public class Stack
{
    int volume;
    int data[];
    static int defaultSize = 5;
//標準サイズのためのコンストラクタ Stack() { this(defaultSize); }
//サイズ指定のためのコンストラクタ Stack(int stackSize) { data = new int[stackSize]; System.out.println(data.length + "個分のスタック生成"); }
//データ追加メソッド boolean push(int number) { if(volume < data.length) { data[volume] = number; volume++; return true; } else { System.out.println("stack overflow"); return false; } }
//データ取得メソッド int pop() { int value; if(volume > 0) { value = data[volume -1]; data[volume -1] = 0; volume--; } else { value = -1; } return value; }
//状態表示メソッド void printStack() { System.out.print("|"); for(int i=0; i < data.length; i++) { System.out.print(data[i]); System.out.print("|"); } System.out.println(""); }
//個別の状態表示メソッド void printStack(int i) { System.out.print("|"); System.out.print(data[i]+"|"); System.out.println(""); } }

演習

スタックと同様に,標準個数でインスタンス化するためのコンストラクタ以外に,指定した個数のキューをインスタンス化するためのコンストラクタを定義せよ.その際には,重複する処理を避けるために,「this」キーワードを活用すること.

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