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 などの変数も考えなければならないかもしれません。これを全て毎回指定するのは愚の骨頂。「ホッピング・パラメタだけ動かす」、「インター・サイト相互作用だけ動かす」などが現実的です。このようなとき、オーバーロードは威力を発揮します。
例の意味がわからない?まあ、良いでしょう。内輪ネタです。
因みに、クラスの継承時に、スーパークラスで定義されたメソッドをサブクラスで上書きすることを、オーバーライドと呼びます。オーバーロードと音は似ていますが、意味が違うので、間違えないように気を付けましょう。