同じ名前のメソッドを作りたい!
メソッドを定義する場合、すでにメソッド名と扱う引数が同じものがあるとそのメソッドは定義することはできません。
しかし、名前が同じでも扱う引数が異なるメソッドならば複数定義することができ、このことをオーバーロードといいます。
メソッド名、引数の数、型、順序の組のことをシグニチャといいます。
メソッドの定義を行う場合、同じシグニチャを持つメソッドがある場合にはそのメソッドは定義することはできませんが、引数の数、型、順序のいずれかが異なる場合には違うシグニチャとなり、同名のメソッドでも定義することができます。
次のような定義をしているクラスがあるとします。
public class Schedule {
public void addSchedule (String date,String text){ …コード… } ……@
public void addSchedule (String text){ …コード… } ……A
}
上記 Schedule クラスにはオーバーロードされた addSchedule メソッドがあり、このメソッドの引数には、スケジュールの日付をあらわす date と、そのスケジュールの内容をあらわす text があります。
@の addSchedule メソッドは引数に date と text を持ち、Aは引数に text のみを持っています。これらのメソッドは呼ばれたときに渡される引数の数、型、順序によって、自動的に渡された引数に適合するメソッドが選択されるようになっています。
このようなオーバーロードされたメソッドを使えば、あるスケジュールを追加する場合に、引数に date と text があれば@のメソッドによってdate の日付に text を追加し、引数が text のみであればAのメソッドによって今日の日付に text を追加するという処理を、同じ名前のメソッドで行うことができます。
引数で文字列を受け取り、その文字列を加工して表示するメソッドを作ります。
その際に、渡された引数が文字列だけならばその文字列の頭 5 文字を表示し、文字列と文字数が渡された場合には文字列を文字数文だけ表示するようにします。
public class OverloadTest {
public static void main(String[] args) {
String s = "同じ名前のメソッドを作りたい!"; //表示する文字列
Sysout so = new Sysout();
System.out.println("引数がひとつの場合");
so.stringEdit(s);
System.out.println("引数がふたつの場合");
so.stringEdit(s,10); //表示する文字数に 10 を指定
}
}
class Sysout {
void stringEdit(String text){ //引数が文字列のみのメソッド
System.out.println( text.substring(0,5) );
}
void stringEdit(String text,int length){ //引数が文字列と文字数のメソッド
System.out.println( text.substring(0,length) );
}
}
この実行結果は次のようになります。
引数がひとつの場合 同じ名前の 引数がふたつの場合 同じ名前のメソッドを