オーバーロード


シグネチャの異なるメソッド

通常、同じ名前のメソッドやコンストラクタは複数作ることはできません
同名のメソッドやコンストラクタが複数ある場合、コンパイラはどれを実行するべきかわからないのでエラーを出します

しかし、JAVA言語はメソッドのオーバーロードをサポートしています
オーバーロードとは、同名のメソッドでもパラメータリストの型が異なれば複数宣言できるのです
メソッド名とパラメータリストのことをあわせてシグネチャと言います
つまり、シグネチャが異なっていればメソッドはオーバーロードすることができます
たとえば、以下の三つのメソッドはシグネチャが違うので有効です

method(int a)
method(int a , int b)
method(double a , double b)

オーバーロードされているJAVAの標準クラスライブラリも多くあります
この機能を利用することによって、複数の型を受け取れる同名のメソッドを作成できます
オーバーロードされているメソッドの呼び出しは、受け取ったパラメータによってコンパイラが自動的に行います
class LOVE_HINA {
	String name;
	char blood_type = '?';
	int age;

	void write() {
		System.out.println(name + "\t" + blood_type + "\t" + age);
	}

	LOVE_HINA(String na , int a) {
		name = na;
		age = a;
	}
	LOVE_HINA(String na , char b , int a) {
		name = na;
		blood_type = b;
		age = a;
	}
}

class test {
	public static void main(String args[]) {
		LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 'A' , 17);
		LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);
		LOVE_HINA mitune = new LOVE_HINA("紺野みつね" , 'B' , 19);

		System.out.println("名前\t\t血液型\t年齢");
		naru.write();
		sinobu.write();
		mitune.write();
	}
}
このサンプルプログラムは、コンストラクタをオーバーロードしています
LOVE_HINAコンストラクタが二つ定義されています

naruとmituneオブジェクト作成時には LOVE_HINA(String na , char b , int a) を呼び出していますが
sinobuオブジェクトの作成時は

LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);

というように、パラメータの数が少ないですね。char型のパラメータがなくなっています
そのため、LOVE_HINA(String na , int a) が呼び出されます
オーバーロードされているメソッドやコンストラクタは、呼び出し時のシグネチャによって適切なものが呼び出されます
上のサンプルプログラムの結果は以下のようになります
名前            血液型  年齢
成瀬川なる      A       17
前原しのぶ      ?       13
紺野みつね      B       19
sinobuオブジェクトは、blood_typeに値を代入していないため、デフォルトの値が使われていますね


サンプルではコンストラクタをオーバーロードしていますが、メソッドでも当然可能です
標準クラスライブラリで、オーバーロードを利用しているメソッドも多く存在します
数学的処理をサポートするMathクラスのmax()メソッドというものがあります

public static int max( int a, int b )
public static long max( long a, long b )
public static float max( float a, float b )
public static double max( double a, double b )

メソッド名は同じですが、シグネチャが異なっています。つまりオーバーロードされています
このメソッドは、パラメータ a ,b のうち大きいほうを戻り値として返します
class test {
	public static void main(String args[]) {
		int ans_i;
		double ans_d;
		ans_i = Math.max(100 , 1000);
		ans_d = Math.max(128.5 , 128.8);

		System.out.println(ans_i + "\n" + ans_d);
	}
}
標準クラスライブラリで、この例のようにオーバーロードされているメソッドも多く見られます



前のページへ戻る次のページへ