2019/02/06
sponsored link
オーバーロードとは?
引数を受け取って処理するメソッドを定義すると、そのメソッドを呼ぶ時は、定義した型の引数を過不足無く正確に渡す必要があります。間違った引数を渡すとコンパイルエラーになります。けど、場合によっては同じメソッドでいろんな引数を渡したい時もあると思います。
例えば、こんなメソッドを作ったとします↓
public static void hello(String name){ System.out.print(name + "さん、こんにちは"); }
このメソッドは引数に文字列を渡して呼ぶと、「○○さん、こんにちは」と画面に出力されるメソッドです。
hello("田中");
とやると、「田中さん、こんにちは」と出力されますね。このメソッドを呼ぶ時は絶対に誰かの名前を入れる必要があります(もちろん名前じゃなくても文字列なら何でもいいんですが・・)。
もし、単純に相手を指定せずに「こんにちは」とだけ出力させたかったら、どうしたらいいでしょうか?相手を指定しないんだから引数に何も渡さずに呼んでみたらどうでしょう?
hello();
これだと、コンパイルエラーになります。このメソッドを定義する時に、String型の変数を受け取れるようにした以上は、絶対に渡さないといけません。
こういう場合に役に立つのがオーバーロードです。こうやります。
public static void hello(String name){ System.out.print(name + "さん、こんにちは"); } public static void hello(){ System.out.print("こんにちは"); }
同じ名前のメソッドで引数を受け取らないものをもう一つ定義するんです。こうしておくことで、もし引数を渡さずに呼んだ場合は下側のhelloメソッドとして処理されるわけです。
このように、同じメソッド名で引数の異なるものを定義することをそのメソッドをオーバーロードすると言います。
オーバーロードの約束事
本当は、同じ名前のメソッドを複数定義するとどっちがどっちか分からないのでコンパイルは通らないのですが、まあオーバーロードならOKですよ。とコンパイラから特別お許しを得ているようなものなので、オーバーロードとして扱ってもらうには守るべき約束事があります。
・約束その1
引数(型)の個数、順番が全く同じものはダメ
public static void hello(String man){ System.out.print(man + "くん、ちわっす"); } public static void hello(String woman){ System.out.print(woman + "さん、こんにちは"); }
こんなのは仮引数の名前が違うだけなのでオーバーロードとは見なしてくれません。当たり前ですよね。もし「hello(“田中”);」と呼ばれたらどっちのメソッドが呼ばれたか判断のしようがないですから。
・・おっと、約束はそれだけです。引数の型が全く同じでさえなければ、戻り値が違っていようとも同じであろうとも、修飾子が違っていようとも同じであろうとも、staticが付こうと付こうまいと何でもOKです。要は引数の型の順番なり個数なりが少しでも違っていたらオーバーロードと見なされます。ちなみに可変長引数リストを持つメソッドの場合、そのメソッドを呼ぶときに渡す引数によってはまぎらわしいこともありますが、可変長引数リストを持つメソッドよりも普通の引数を持つメソッドの方が優先されるというルールがあるのでまぎらわしくても大丈夫です。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
質問させていただきます。
可変長引数とは何ですか?そしてとうやって使うのですか?
教えてください。
by 匿名 2017/08/07 20:15
>匿名さん
分からないところは、teratailで質問してみて下さい。丁寧に答えてもらえますよ!
by Nobuo@管理人 2017/08/08 23:58