2015年9月17日木曜日

引数があるコンストラクタ、引数が異なるコンストラクタ

コンストラクタについてはすでに説明しました。しかし、コンストラクタにも「引数(ひきすう)があるコンストラクタ」や「引数が異なるコンストラクタ」が存在します。引数(argument)とはなにかというと、プログラムにおける手続きにおいて、外部と値をやりとりするための特別な変数、あるいはその変数の値のことです。ウィキペディアにも引数のページがあります

実際に書いてみる

それでは実際にコードを書いてみて具体的になにが「引数があるコンストラクタ」「引数が異なるコンストラクタ」なのかを確認してみましょう。

class Test{
public static void main(String arg[]){
    SubTest objectdayo = new SubTest(100);
    objectdayo.display();
    }
class SubTest{
    private int MemberVariable1; 
    SubTest(int NewMemberVariable){
    MemberVariable1 = NewMemberVariable;
    } 
    public void display(){
    System.out.println("現在の数字は " + MemberVariable1 +" です");
    }
}

赤いのがコンストラクタですね。このコンストラクタはメンバ変数「MemberVariable1」を「NewMemberVariable」に初期化しています。で、よくみるとコンストラクタに引数が設定してあるのがわかりますね(青いところ)。これが「引数があるコンストラクタ」です。
実行するとこうなります。


「引数があるコンストラクタ」によってオブジェクトごとに違う数字を設定することができます。
class Test{
public static void main(String arg[]){
    SubTest objectdayo1 = new SubTest(100);
    objectdayo1.display(); 
    SubTest objectdayo2 = new SubTest(200);
    objectdayo2.display(); 
    SubTest objectdayo3 = new SubTest(999);
    objectdayo3.display(); 

    }
class SubTest{
    private int MemberVariable1;  
    SubTest(int NewMemberVariable){
    MemberVariable1 = NewMemberVariable;
    }  
    public void display(){
    System.out.println("現在の数字は " + MemberVariable1 +" です");
    }
}
青い部分に注目してください。3つのオブジェクトを作りました。それぞれ違う数字が設定されていますね。これを実行するとこういう風になります。


つまり、「引数があるコンストラクタ」とはオブジェクト作成時に引数を渡すことができるコンストラクタのことです。上記の例では100, 200, 999という引数をSubTestというコンストラクタに渡しています。さて、「引数があるコンストラクタ」についてはわかりました。

では、「引数が異なるコンストラクタ」とはなんでしょうか?コンストラクタに引数を設定する場合、引数の数や型が異なるものであれば、1つのクラスの中に複数のコンストラクタを記述できます。

class Test{
public static void main(String arg[]){
    SubTest objectdayo1 = new SubTest();
    objectdayo1.display(); 
    SubTest objectdayo2 = new SubTest(200, "おーい");
    objectdayo2.display();
    }
class SubTest{
    private int num;
    private String word;  
    SubTest(){
    num = 100;
    word = "こんにちは";
    } 
    SubTest(int newNum, String newWord){
    num = newNum;
    word = newWord;
    }  
    public void display(){
    System.out.println("現在の数字は " + num + " で、現在の言葉は " + word + " です。");
    }
}


青い部分を見てみてください。ひとつのクラスのなかにコンストラクタが2つ記述されています。オブジェクトを作る際になにも設定しなかった場合は(上のコンストラクタSubTest()によって)100と「こんにちは」という値が返されます。int型の値とString型の値を設定した場合は(下のコンストラクタSubTest(int newNum, String newWord)によって)その値がそのまま返されます。

1つ目のオブジェクト「objectdayo1」には何も値が設定されていません。2つ目のオブジェクト「objectdayo2」には200という整数と「おーい」という言葉が設定されています。
よって、実行結果は以下のようになります。


またコンストラクタからコンストラクタを呼び出すこともできます。コンストラクタからコンストラクタを呼び出す場合は this(); というふうに記述します。このとき、引数は呼び出したいコンストラクタで指定されている引数を記述します。

class Test{
public static void main(String arg[]){ 
    SubTest objectdayo1 = new SubTest(777, "あああ");
    objectdayo1.display(); 
    SubTest objectdayo2 = new SubTest();
    objectdayo2.display(); 
    }
class SubTest{
    private int Num;
    private String Word; 
    SubTest(){
    this("うううう");  
    } 
    SubTest(String NewWord){
    Num = 2000;
    Word = "他のコンストラクタから呼び出されたよ";
    } 
    SubTest(int NewNum, String NewWord){
    Num = NewNum;
    Word = NewWord;
    } 
    public void display(){
    System.out.println("現在の数字は " + Num +" で、現在の言葉は " + Word +" です。");
    }
}

赤いコンストラクタを見てみてください。ここではString型の値「うううう」を this(); のなかに入力しています。String型の入力だけがされ、int型の値が入力されなかった場合、それに対応した青いほうのコンストラクタSubTest(String NewWord)が呼び出され、その内容が実行されます。