はじめに
スクールでメソッドやコンストラクタを呼び出す際、引数名と型が違えば同名のメソッドやコンストラクタを定義して呼び出せるオーバーロード
を学習しました。その際に出てきた疑問を整理して以下の例題で検証してみました。
public class Overload {
//引数なし
public void sayHello() {
System.out.println("こんにちは!");
}
//引数name
public void sayHello(String name) {
System.out.println("こんにちは!私の名前は" + name + "です。");
}
//引数name, hobby
public void sayHello(String name, String hobby) {
System.out.println("こんにちは!私の名前は" + name + "です。趣味は" + hobby + "です。");
}
public static void main(String[] args) {
//Overloadクラスをインスタンス化
Overload over = new Overload();
//引数なし
over.sayHello(); //
//引数name //
over.sayHello("山田太郎"); // オーバーロード
//引数name, hobby //
over.sayHello("山田太郎", "釣り"); //
}
//演算結果
//こんにちは!
//こんにちは!私の名前は山田太郎です。
//こんにちは!私の名前は山田太郎です。趣味は釣りです。
引数名が違う・型は同じ → ×
以下のようにしても、型が同じなのでエラーになりました。
つまり型が同じものの場合は個数
で区別しているらしい。
public void sayHello(String name, String hobby)
public void sayHello(String hobby, String name)
引数名が同じ・型は違う → 〇
以下のようにすれば可能だった。つまり変数名はあまり関係ない
ようである。
が、引数名のお作法的にアウトでしょw
public void sayHello(String name, String hobby)
public void sayHello(int name, int hobby)
順番が違う → 〇
ここが一番気になったところである。以下の通りに新たに作って検証。
結果はどちらも正常に出力された。
つまり個数は同じでも順番が違えば
区別してくれる。
public void sayHello(String name, int age) {
System.out.println("こんにちは!私の名前は" + name + "です。年齢は" + age + "です。");
}
public void sayHello(int age, String name) {
System.out.println("こんにちは!私の名前は" + name + "です。年齢は" + age + "です。");
}
まとめ
オーバーロードにおいて、どの型がどの順番になっているか
でJavaは区別している。
意外と細かく見てくれているのね。