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


前回はメソッドのオーバーロードについてみました。今回はコンストラクタのオーバーロードについてみていきます。

コンストラクタ

Wikipedia >>  オブジェクト指向 を引用します。

コンストラクタ(構築子、Constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数、メソッドの事。

詳しくは記事「コンストラクタ」を参照

オーバーロード

コンストラクタのオーバーロードとはコンストラクタを複数定義することです。しかしコンストラクタが複数あると、コンストラクタの呼び出し時にどのコンストラクタを実行していいのかわからなくなります。そこでコンストラクタを複数を定義するときには一定の制約があります。

「仮引数の型、仮引数の数」の組み合わせが全く同じコンストラクタは重複して作成できない

オーバーロードでは仮引数の型や仮引数の数の違いによりどのコンストラクタを区別します。仮引数の型や仮引数の数までも同じだと区別ができなくなるため、全ての組み合わせが同じコンストラクタを作成しようとするとエラーになります。

詳しくは記事「オーバーロード」を参照

サンプル

【OverloadTest .java】

public class OverloadTest {
	OverloadTest(int x ){ 	                    //(1)
		System.out.println("(1) x=" + x);
	}
	OverloadTest(double x ){                    //(2)
		System.out.println("(2) x=" + x);
	}
	OverloadTest(int x , int y){                //(3)
		System.out.println("(3) x=" + x + " y=" + y);
	}
}

このクラスにはコンストラクタが3つあります。(1)と(3)は両方ともint型の仮引数をもちますが仮引数の数が違います。(1)と(2)は両方とも仮引数の数は1つですが仮引数の型が違います。このように「仮引数の型」と「仮引数の数」の組み合わせが異なるので複数のコンストラクタを定義することができます。

【Sample.java】

public class Sample {
    public static void main(String[] args) {
    	OverloadTest object1 = new OverloadTest(10);       //(1)
    	OverloadTest object2 = new OverloadTest(3.5);      //(2)
    	OverloadTest object3 = new OverloadTest(20 , 50);  //(3)
    }
}
(1) x=1
(2) x=10 y=20
(3) x=3.5

3~5行目で3つのインスタンスを生成しています。結果をみると引数から判断して対応するコンストラクタを実行していることがわかります。

コンストラクタから別のコンストラクタを実行

【OverloadTest .java】

public class OverloadTest {
	OverloadTest(int x , int y){                      //(1)
		System.out.println("x=" + x + " y=" + y);
	}
	OverloadTest(){                                   //(2)
		this(11 , 22);
		System.out.println("別コンストラクタ後");
	}
}

コンストラクタはインスタンスの生成時に一度だけ呼び出されます。別のコンストラクタを呼び出すときもコンストラクタ内からでないとエラーになります。別コンストラクタの呼び出しは6行目のように

this (引数1、引数2、・・・・)

で記述します。thisに指定した引数の型や引数の数により、どのコンストラクタを呼び出すか判断されます。別のコンストラクタを実行した後、自分のコンストラクタ処理の続きを行います。

【Sample.java】

public class Sample {
    public static void main(String[] args) {
    	OverloadTest object1 = new OverloadTest(20 , 50);
    	System.out.println("--------------");
    	OverloadTest object2 = new OverloadTest();
    }
}
x=20 y=50
--------------
x=11 y=22
別コンストラクタ後

5行目のインスタンス生成ではコンストラクタの引数がないため(2)のコンストラクタが呼び出されています。(2)のコンストラクタには this で(1)が呼び出され、その後に(2)のコンストラクタの続きが実行されているのがわかります。

this の位置

public class OverloadTest {
	OverloadTest(int x , int y){                      //(1)
		System.out.println("x=" + x + " y=" + y);
	}
	OverloadTest(){                                   //(2)
		System.out.println("別コンストラクタ前");
		this(11 , 22);
	}
}
Exception in thread "main" java.lang.Error:
                     Unresolved compilation problem:
	コンストラクター呼び出しは、コンストラクター内の
        最初のステートメントである必要があります

「this」の位置には制約があります。コンストラクタの一番最初に記述しなければなりません。サンプルのようにコンストラクタの最初のステートメントに書かないとエラーになります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です