オーバーロード

Revised: Feb./14th/2003: Since: Dec./28th/2001

オーバーロードとは何か

Java では、メソッドを識別するのに、メソッド名と引数リストの組を使います。これをシグネチャ(署名)と呼びます。同じメソッド名でも、引数リストの異なるものは、別のものとして扱われます。同じメソッド名で、引数リストの異なるメソッドを同時に定義することを、メソッドのオーバーロードと呼びます。

サンプル

次のコードはオーバーロードのサンプルです。クラス GetMean には二つのメソッドが実装されています。一つは、引数を一つ持つメソッド mean()。もう一つは、引数を二つ持つメソッド mean() です。メソッド名が同じで、引数リストの異なるこれらのメソッドは、オーバーロードの関係にあります。

OverLoadTest.java:

class GetMean {
	//メンバ変数
	double x;
	//メソッド1:引数は一つ
	void mean(double a) {
		x = a / 10;
	}
	//メソッド2:引数は二つ
	void mean(double a, int b) {
		x = a / b;
	}
}
class OverLoadTest {
	public static void main(String[] args) {
		//インスタンス化:オブジェクト obj の作成
		GetMean obj = new GetMean();
		System.out.println("メソッド1");
		//引数は一つ
		obj.mean(870.0);
		System.out.println("obj.x: " + obj.x);
		System.out.println("メソッド2");
		//引数は二つ
		obj.mean(972.0, 11);
		System.out.println("obj.x: " + obj.x);
	}
}

ここでは GetMean クラスで、 mean() メソッドをオーバーロードしています。引数が一つ指定されたら 10 で割って、二つ指定されたら二つ目の引数で一つ目を割ります。

C:\Java>javac TestOverLoad.java
C:\Java>java TestOverLoad
メソッド1
obj.x: 87.0
メソッド2
obj.x: 88.36363636363636

オーバーロードの使い道

このオーバーロードと言う仕様は、なかなかイカシテルと思います。例えば、「変数が5つあって、殆どの場合は3つしか動かさない、例外的に残り2つも動かす」と言う場合、このメソッドを三つオーバーロードしておけば、通常は引数を三つだけ与えて、気が向けば5つ全部、或いは4つ与えればいいことになります。オーバーロードしないと、このメソッドを呼ぶたびに、5つ全部の引数を与えなければならず面倒です。

// 引数三つのメソッド
void method(int a, int b, int c) {
	System.out.println("a * b * c = " + (a * b * c));
}
// 引数二つのメソッド
void method(int a, int b) {
	System.out.println("c はデフォルト値 1 を使います。");
	method(a, b, 1);
}

オーバーロードは、メソッド名が同じで、引数の型の組が異なるメソッドを作る仕組みです。引数の組まで同じにするとコンパイルエラーになります。なぜなら、メソッド名も引数の型の組も同じにすると、呼び出し時にどちらを実行してよいか分からなくなるからです。

オーバーロードされたメソッドは別のメソッドとして区別されるので、戻り値型や修飾子などは任意のものが指定できます。

double add(double a, double b) {
	return a * b;
}
int add(int a, int b) {
	return a * b;
}

実際の利用例は色々思いつきます。例えば、変数が、「温度 T、オン・サイトの相互作用 U、x軸方向の相互作用 Vx、y軸方向の相互作用 Vy、xy軸方向の相互作用 Vxy、x軸方向のホッピング tx、y軸方向のホッピング ty、xy軸方向のホッピング txy」とあったとします。これに加えて、z軸方向の層間相互作用、ホッピング、ユニットセル内サイト数 Nu、フィリング n などの変数も考えなければならないかもしれません。これを全て毎回指定するのは愚の骨頂。「ホッピング・パラメタだけ動かす」、「インター・サイト相互作用だけ動かす」などが現実的です。このようなとき、オーバーロードは威力を発揮します。

例の意味がわからない?まあ、良いでしょう。内輪ネタです。

因みに、クラスの継承時に、スーパークラスで定義されたメソッドをサブクラスで上書きすることを、オーバーライドと呼びます。オーバーロードと音は似ていますが、意味が違うので、間違えないように気を付けましょう。



Copyright © 2001-2003 SUGAI, Manabu. All Rights Reserved.