メソッドは同じメソッド名で複数定義することができ、オーバーロード(多重定義)と呼ばれます。同じメソッド名でメソッドを作ることで、メソッドを利用する側の利便性を向上させることができます。
もくじ
オーバーロードのルール
変数は基本的に同じ名前で宣言することができません。※
※同じ名前でもフィールドとローカル変数に分かれていれば可能
しかし、メソッドは引数の形を変えることによって同じメソッド名で定義することができ、オーバーロードと呼びます。
引数の形とは「引数の型、引数の数、引数の型の並び」を指し、この中の一つでも異なればオーバーロードとして扱われ同じメソッド名で定義できます。
アクセス修飾子や戻り値の型(void含む)が異なっていても、オーバーロードとして扱われませんので、コンパイルエラーとなります。
また、引数内の変数名のみ変更しても引数の形が同じ場合、オーバーロードとして扱われませんのでコンパイルエラーとなります。
以下はオーバーロードとして扱われるものと扱われないものの例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//メソッド1 void method(){ 処理 } //メソッド2 メソッド1のオーバーロード void method(String s){ 処理 } /* メソッド3 戻り値の型は異なるが、メソッド1のオーバーロードにはならない コンパイルエラーとなる */ int method(){ 処理 return 戻り値; } /* メソッド4 変数名は異なるが、メソッド2と型が同じのためオーバーロードにはならない コンパイルエラーとなる */ void method(String str){ 処理 } |
オーバーロードの役割
オーバーロードを活用すると呼び出し側の利便性を向上できます。一般的に定義側は処理が長くなります。オーバーロードを利用しなくてもプログラムは作れますが、「ほとんど同じ処理だが、引数だけ異なる」ようなメソッドはオーバーロードで定義するのがいいでしょう。
オーバーロード サンプルプログラム
以下のプログラムを「Taiyaki2.java」「Number31.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、Number31.javaをコンパイルおよび実行をしてみましょう。※Taiyaki.javaは作成済みの場合は、中身をコピーして記述を変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//たい焼きクラスの作成 class Taiyaki2{ //たい焼きの中身 private String nakami; //たい焼きのサイズ private String size ; //グラム数 private double gram ; //たい焼きの中身を確認する void open(){ System.out.println("たい焼きの中身は" + nakami + "です"); System.out.println("たい焼きは" + gram + "g、サイズは" + size + "です"); } //たい焼きのサイズをreturnする String getSize(){ return size; } /* たい焼きの中身のみ引数で設定する グラム数はデフォルトの値を設定する */ void set(String n){ set(n,90); } /* たい焼きの中身、グラム数を引数で設定する サイズはグラム数に応じて値を設定する */ void set(String n,double g){ nakami = n; //中身をフィールドへ gram = g; //グラム数をフィールドへ if(gram < 70){ size = "小"; }else if(gram < 91){ size = "中"; }else{ size = "大"; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Number31{ public static void main(String[] args){ Taiyaki2 taiyaki = new Taiyaki2(); //名前だけ設定 taiyaki.set("あんこ"); //確認 taiyaki.open(); //名前とグラム数で設定しなおし taiyaki.set("チョコ",110); taiyaki.open(); } } |
実行例
C:\work>javac Number31.java
C:\work>java Number31
たい焼きの中身はあんこです
たい焼きは90.0g、サイズは中です
たい焼きの中身はチョコです
たい焼きは110.0g、サイズは大です
※実行例はコンパイルおよび実行までの例を表示しています。
オーバーロードサンプルプログラムの補足
サンプルプログラムTaiyaki2.javaでは以下の部分がオーバーロードとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void set(String n){ set(n,90); } void set(String n,double g){ nakami = n; //中身をフィールドへ gram = g; //グラム数をフィールドへ if(gram < 70){ size = "小"; }else if(gram < 91){ size = "中"; }else{ size = "大"; } } |
void set(String n)と void set(String n,double g)で引数の数が異なっているので、同じメソッド名で定義できます。
もちろん、void setNakami(String n)とvoid setNakamiAndGram(String n,double g)のように別の名前でメソッドを定義してもかまいません。
同じ名前で利用できた方が便利なメソッドとしては以下のようなメソッドが考えられます。
1 2 3 4 5 6 7 8 |
double method(double number){ return number * number ; } double method(String number){ double d = Double.parseDouble(number); return d * d; } |
引数から受け取ったデータで簡単な計算を行うメソッドです。引数の数はどちらも一つだけですが、型が違うのでオーバーロードとなります。
このメソッドはdouble型で送られてきた値はそのまま計算処理を行い、String型で送られてきた値は数値に変換して計算処理を行っています。記述が多くなっているだけのように思うかもしれません。ですが、呼び出し側では以下のように型が変わっても呼び出しを行えます。
xxx.method(10.5);
xxx.method(“10.5”);
呼び出し側と定義側の引数は形(型、数、並び)が同じである必要がありますが、オーバーロードを利用することで、様々な引数でメソッドが利用できるようになり、より利便性の高いメソッドを作成することができます。
オーバーロードを利用しているプログラム
Javaでよく目にする耳にするプログラムでオーバーロードが利用されているものがあります。それはSystem.out.println()です。※以下Sysout()と表記
Sysout()はインスタンスを生成しなくても利用できるメソッドです。
※詳細はstaticの項で説明
Sysout()もメソッドですから、本来は引数の形は決まっています。Sysout()の引数()内は数は一つとなります。つまり、2つ以上の引数を指定するとエラーとなります。
ですが、引数が一つ※であれば様々な型を記述することができます。基本データ型はもちろんのこと、型はクラスや配列であっても問題ありません。
※Sysout()は引数なしもあります
これは様々な型で出力処理が行えるように、Sysout()が引数の型のみを変更して複数定義されているからです。
オーバーロード 復習問題
- オーバーロードの説明として正しいものを選んでください。
- 解答群
- 引数の型が異なれば、引数内の変数名は同じであってもオーバーロードになる
- 引数内の変数名が異なれば、引数の型が同じであってもオーバーロードになる
- 戻り値が異なればオーバーロードとなる
- アクセス修飾子が異なればオーバーロードとなる
- int method()メソッドのオーバーロードにならないメソッド定義を下から選んでください。
- 解答群
void method()
int method(int a, int b)
int method(double a)
int method(double a, double b)
- void method(int a)メソッドのオーバーロードにならないメソッド定義を下から選んでください。
- 解答群
int method(int a, int b)
int method(int number)
int method(double a, double b)
int method(double a)
- お疲れ様でした。
まとめ
- オーバーロードは引数の形が異なれば同じメソッド名で定義できること
- 引数の形とは「引数の型、数、型の並び」
- 戻り値の型やアクセス修飾子、引数内の変数名などが異なってもオーバーロードとはみなされない
- 同じメソッド名が利用できることで呼び出し側の利便性が向上する