とにかくいろいろオーバーロードしてみた

ふと気になったのでJavaオーバーロードをいろいろ試してみた。


環境はJDK1.5.0_12


オーバーロードっていうと同じメソッド名で複数のメソッドを作り
パラメータの型によって呼び出し先を変えるという仕組みです。
Javaではおなじみの機能。

private void testMethod(String str){
  System.out.print("testMethod(String str) called");
}

private void testMethod(String str,String str2){
  System.out.print("testMethod(String str,String str2) called");
}

上のメソッドを呼びたい時はtestMethod("a")
下のメソッドを呼びたい時はtestMethod("a","b")
とすることで呼び出しが可能です。

そしてJDK1.5では可変引数も利用可能なのでこんな記述もできます。

private void testMethod(String...str){
  System.out.print("testMethod1(String...str) Called");
}

とりあえず試してみる


さっき出てきた3つのメソッド(引数1個、引数2個、可変引数)を実装
したクラスを作ってみた

public class OverLoadTest {
  
  public static void main (String[] args){
    OverLoadTest ovl = new OverLoadTest();
    ovl.testMethod("a");
  }
  
  private void testMethod(String...str){
    System.out.print("testMethod1(String...str) Called");
  }
  
  private void testMethod(String str){
    System.out.print("testMethod(String str) called");
  }

  private void testMethod(String str,String str2){
    System.out.print("testMethod(String str,String str2) called");
  }

}

上のソースではovl.testMethod("a")として引数1個を与えてオーバーロード
されたtestMethodを呼び出している。


実行結果

testMethod(String str) called

引数が1個で定義されたものが呼び出された。
引数を2個で呼び出すと2個で定義されたもの。
引数を3個以上で呼び出すと可変引数で定義されたものがそれぞれ呼び出された。

引数なしはどうなんのよ?


引数なしで実行すると上のソースであれば可変引数のものが呼び出された。
ためしに以下のメソッドを追加してみた。

private void testMethod(){
  System.out.print("testMethod() Called");
}

こうするとなんとも不思議なことに引数なしのものが呼ばれた。てっきりコンパイ
ルエラーになると思っていた。*1

結論


記述順序関係なく引数の数でメソッドの呼び出し先を決定している。
可変引数と引数が固定されているものが混在している場合は固定されているものを
先にチェックして、該当しなければ可変引数を呼び出している。

オチ

ちょっと言語仕様確認するとこんなことが書いてあった。

一般的に、可変引数を使用するメソッドはオーバーロードしないようにします。


オーバーロードすると、プログラマにとっては、どのオーバーロードが呼び出された


のかわかりにくくなるからです。



可変引数


ですよね〜

*1:呼び出し先が特定できないような呼び出し方はコンパイルエラーとなる