Javaとオブジェクト指向 オーバーロード(4-7)

記事上広告

メソッドは同じメソッド名で複数定義することができ、オーバーロード(多重定義)と呼ばれます。同じメソッド名でメソッドを作ることで、メソッドを利用する側の利便性を向上させることができます。

オーバーロードのルール

変数は基本的に同じ名前で宣言することができません。
※同じ名前でもフィールドとローカル変数に分かれていれば可能

しかし、メソッドは引数の形を変えることによって同じメソッド名で定義することができ、オーバーロードと呼びます。

引数の形とは「引数の型、引数の数、引数の型の並び」を指し、この中の一つでも異なればオーバーロードとして扱われ同じメソッド名で定義できます。

アクセス修飾子や戻り値の型(void含む)が異なっていても、オーバーロードとして扱われませんので、コンパイルエラーとなります。

また、引数内の変数名のみ変更しても引数の形が同じ場合、オーバーロードとして扱われませんのでコンパイルエラーとなります。

以下はオーバーロードとして扱われるものと扱われないものの例です。

オーバーロードの役割

オーバーロードを活用すると呼び出し側の利便性を向上できます。一般的に定義側は処理が長くなります。オーバーロードを利用しなくてもプログラムは作れますが、「ほとんど同じ処理だが、引数だけ異なる」ようなメソッドはオーバーロードで定義するのがいいでしょう。

オーバーロード サンプルプログラム

以下のプログラムを「Taiyaki2.java」「Number31.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、Number31.javaをコンパイルおよび実行をしてみましょう。※Taiyaki.javaは作成済みの場合は、中身をコピーして記述を変更してください。

実行例

C:\work>javac Number31.java

C:\work>java Number31
たい焼きの中身はあんこです
たい焼きは90.0g、サイズは中です
たい焼きの中身はチョコです
たい焼きは110.0g、サイズは大です

※実行例はコンパイルおよび実行までの例を表示しています。

オーバーロードサンプルプログラムの補足

サンプルプログラムTaiyaki2.javaでは以下の部分がオーバーロードとなっています。

void set(String n)と void set(String n,double g)で引数の数が異なっているので、同じメソッド名で定義できます。

もちろん、void setNakami(String n)void setNakamiAndGram(String n,double g)のように別の名前でメソッドを定義してもかまいません。

同じ名前で利用できた方が便利なメソッドとしては以下のようなメソッドが考えられます。

引数から受け取ったデータで簡単な計算を行うメソッドです。引数の数はどちらも一つだけですが、型が違うのでオーバーロードとなります。

このメソッドはdouble型で送られてきた値はそのまま計算処理を行い、String型で送られてきた値は数値に変換して計算処理を行っています。記述が多くなっているだけのように思うかもしれません。ですが、呼び出し側では以下のように型が変わっても呼び出しを行えます。

xxx.method(10.5);

xxx.method(“10.5”);

呼び出し側と定義側の引数は形(型、数、並び)が同じである必要がありますが、オーバーロードを利用することで、様々な引数でメソッドが利用できるようになり、より利便性の高いメソッドを作成することができます。

オーバーロードを利用しているプログラム

Javaでよく目にする耳にするプログラムでオーバーロードが利用されているものがあります。それはSystem.out.println()です。※以下Sysout()と表記

Sysout()はインスタンスを生成しなくても利用できるメソッドです。
※詳細はstaticの項で説明

Sysout()もメソッドですから、本来は引数の形は決まっています。Sysout()の引数()内は数は一つとなります。つまり、2つ以上の引数を指定するとエラーとなります。

ですが、引数が一つであれば様々な型を記述することができます。基本データ型はもちろんのこと、型はクラスや配列であっても問題ありません。
※Sysout()は引数なしもあります

これは様々な型で出力処理が行えるように、Sysout()が引数の型のみを変更して複数定義されているからです。


画像はSysout()のAPIドキュメントより抜粋

オーバーロード 復習問題

問題
  • オーバーロードの説明として正しいものを選んでください。
  • int method()メソッドのオーバーロードにならないメソッド定義を下から選んでください。
  • void method(int a)メソッドのオーバーロードにならないメソッド定義を下から選んでください。
  • お疲れ様でした。
解答群
    1. 引数の型が異なれば、引数内の変数名は同じであってもオーバーロードになる
    2. 引数内の変数名が異なれば、引数の型が同じであってもオーバーロードになる
    3. 戻り値が異なればオーバーロードとなる
    4. アクセス修飾子が異なればオーバーロードとなる
    1. void method()
    2. int method(int a, int b)
    3. int method(double a)
    4. int method(double a, double b)
    1. int method(int a, int b)
    2. int method(int number)
    3. int method(double a, double b)
    4. int method(double a)

まとめ

  • オーバーロードは引数の形が異なれば同じメソッド名で定義できること
  • 引数の形とは「引数の型、数、型の並び」
  • 戻り値の型やアクセス修飾子、引数内の変数名などが異なってもオーバーロードとはみなされない
  • 同じメソッド名が利用できることで呼び出し側の利便性が向上する
参加 ブログランキング

記事頑張って書いたかもねー?と思う方は下を押してもらえるといいかなーなんて
にほんブログ村 IT技術ブログへ
にほんブログ村


Javaランキング

目次へのアクセス
スポンサーリンク
レクタングル

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル