同じメソッド名を使って引数の型や個数が異なるメソッドを複数個宣言することの「オーバーロード」と呼びます.多重定義とも呼びます.
オーバーロード可能/不可能の場合と,その理由について簡単にまとめたいと思います.
見極めは,メソッド実行前にどのメソッドか特定できるか否か が重要になってきます.
オーバーロードできる場合:3つ
- 引数の種類が異なっている場合
- 引数の個数が異なっている場合
- 引数のデータ型と個数は同じでも,順番が異なっている場合
上記の場合,同じクラス内に同じメソッドがあってもコンパイルエラーになりません.(オーバーロードしている)
// 1. 引数の種類が異なっている場合
public int add(int a, int b) {
return a + b;
}
// オーバーロードされたメソッド
public double add(double a, double b) {
return a + b;
}
// 2. 引数の個数が異なっている場合
public int add(int a) {
return a + 1;
}
// オーバーロードされたメソッド
public double add(int a, int b) {
return a + b;
}
// 3. 引数のデータ型と個数は同じでも,順番が異なっている場合
public int add(int a, double b) {
return a + (int)b;
}
// オーバーロードされたメソッド
public double add(double a, int b) {
return (int)a + b;
}
オーバーロードできない場合:2つ
・引数の変数だけが違う(引数の型自体は同じ)
・戻り値が異なっている場合
// 引数の変数だけが違う場合
public int add(int a) {
return a + 1;
}
// オーバーロードされたメソッド
public double add(int b) {
return b + 1;
}
// 戻り値が異なっている場合
public String test(int a) {
//何らかの処理
return "";
}
// オーバーロードされたメソッド
public int test(int a) {
return b + 1;
}
オーバーロードできる/できないの理由について
JVMは以下の3つの方法で実行するべきメソッドを探し出します.
・参照(どのインスタンスのメソッドか)
・クラス名(どのクラスのstaticメソッドか)
・シグニチャ
シグニチャとは,メソッド名と引数リストのセットのことを指します.
この観点から考えると,オーバーロードできる3つの場合はメソッドの実行前の段階で,コンパイラはどのメソッドを選べば良いかはっきりします.しかしながらできない場合を考えると,どれを選ぶべきか曖昧になってしまいコンパイルエラーとなってしまいます.
と考えればよさそうです.
まとめ
オーバーロードについて,理由も踏まえてメモしました.
以下の書籍はjava Sliverの対策書ですが,Javaの基本文法のよい復習になるとても良い本だと思います.
リンク