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