メソッドのオーバーロード

広告

メソッドを引数を付けて呼び出す時、引数に記述する値のデータ型はメソッドで決められたものしか指定できません。その為、同じような機能を持つメソッドであっても引数のデータ型が異なれば別々のメソッドを用意する必要があります。

次の例を見てください。

public static void main(String args[]){
  int n = plusInt(10, 7);
  System.out.println(n);

  double d = plusDouble(3.14, 7.4);
  System.out.println(d);
}

private static int plusInt(int n1, int n2){
  return n1 + n2;
}

private static double plusDouble(double d1, double d2){
  return d1 + d2;
}

この例ではint型の値の加算を行うメソッドとdouble型の値の加算を行うメソッドを2つ用意しています。これはこれで間違いではありません。ただ、同じような機能を持つメソッドであれば引数のデータ型が異なっていても同じメソッド名を使って呼び出せると便利です。そこでJavaではメソッドのオーバーロードという仕組みを利用します。

Javaでは引数のデータ型や引数の数が完全に一致していなければ異なるメソッドに同じメソッド名を付けることが出来ます。例えば先ほどの例は次のように記述することが可能です。

public static void main(String args[]){
  int n = plus(10, 7);
  System.out.println(n);

  double d = plus(3.14, 7.4);
  System.out.println(d);
}

private static int plus(int n1, int n2){
  return n1 + n2;
}

private static double plus(double d1, double d2){
  return d1 + d2;
}

plusメソッドは同じクラスの中に2回定義されていますが、引数の数は同じでも引数のデータ型が異なるため区別することが可能です。メソッドを呼び出す側からはplusメソッドを呼び出した時に指定した引数のデータ型によってどちらのメソッドが呼び出されるのかが決まる事になります。

メソッド名を明確に分けたほうが便利な場合もありますが、メソッド名を同じにしておけば引数のデータ型を意識することなく利用することができます。例えばサンプルでもよく利用する「System.out.println(引数);」と言う文も、引数に整数を入れても文字列を入れても同じように画面に出力されるのは、このオーバーロードの仕組みを利用しています。

オーバーロードができる場合

同じメソッド名で複数のメソッドを定義するには、引数の数が異なっているか、引数のデータ型が異なっている必要があります。

引数の数が異なっている場合:

private static void test(int n1){
  // ...
}

private static void test(int n1, int n2){
  // ...
}

引数の種類が異なっている場合:

private static void test(int n1){
  // ...
}

private static void test(double d1){
  // ...
}

引数のデータ型と数は同じでも順番が異なっている場合:

private static void test(int n1, double d1){
  // ...
}

private static void test(double d1, int n1){
  // ...
}

このいずれかの条件さえ満たしていれば、同じメソッド名であっても2つまたそれ以上のメソッドを同じクラス内に定義することができます。

オーバーロードができない場合

次にオーバーロードができない場合も確認しておきます。

メソッド定義の時の引数の変数名だけが異なるようなものはオーバーロードできません。また戻り値の有る無しや戻り値のデータ型異なっているだけのものもオーバーロードすることはできません。

× 引数の変数名だけが異なっている場合:

private static void test(int a){
  // ...
}

private static void test(int b){
  // ...
}

× 戻り値だけが異なっている場合:

private static void test(int n){
  // ...
}

private static int test(int n){
  // return n;
}

このように変数名だけが異なっている場合や戻り値だけが異なっているメソッドを複数記述した場合は、コンパイルエラーとなり「(メソッド名) は (クラス名) で定義されています。」のようなエラーメッセージが表示されます。

サンプル

では簡単な例で試しておきます。

JSample8_1.java

class JSample8_1{
  public static void main(String args[]){
    System.out.println(plus(10, 7));
    System.out.println(plus(3.2, 4));
    System.out.println(plus(7, 1.223));
    System.out.println(plus(5.08, 2.4));
  }

  private static int plus(int n1, int n2){
    System.out.println("int + int");
    return n1 + n2;
  }

  private static double plus(int n1, double d1){
    System.out.println("int + double");
    return n1 + d1;
  }

  private static double plus(double d1, int n1){
    System.out.println("double + int");
    return n1 + d1;
  }

  private static double plus(double d1, double d2){
    System.out.println("double + double");
    return d1 + d2;
  }
}

コンパイル後に実行すると次のように表示されます。

p8-1

引数のデータ型によって呼び出されるメソッドが決まっていることが確認できます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)