今回はオーバーロードについて説明します。
オーバーロードとは
オーバーロードとは「1つのクラスの中で、同じ名前のメソッドを複数定義すること」です。
しかし同じ名前のメソッドを定義してしまったら、呼び出す際にどのメソッドを呼び出せばいいかわからなくなってしまいます。
では、どのように同じ名前のメソッド区別するのでしょうか。
それは、引数の型や数の違いによって区別します。
メソッド呼び出す際に、引数の型や数を指定します。
すると、指定した引数の型や数に対応したメソッドが呼ばれる。
これがオーバーロードです。
サンプルプログラム
ではサンプルプログラムをみてみます。
class Human { String name = "名無し"; // インスタンス変数 int age = 0; // インスタンス変数 void setData() { // setDataメソッド1 } void setData(String n) { // setDataメソッド2 name = n; } void setData(String n, int a) { // setDataメソッド3 name = n; age = a; } void getData() { System.out.println("名前は" + name + "さんです。年齢は" + age + "歳です。"); } } public class Sample12_1 { public static void main(String[] args) { Human h1 = new Human(); // 引数なし h1.setData(); // 引数なし。setDataメソッド1と合致 h1.getData(); h1.setData("鈴木"); // 引数一つ・String型。setDataメソッド2と合致 h1.getData(); h1.setData("佐藤", 20); // 引数二つ・String型とint型。setDataメソッド3と合致 h1.getData(); } }
実行結果
名前は名無しさんです。年齢は0歳です。
名前は鈴木さんです。年齢は0歳です。
名前は佐藤さんです。年齢は20歳です。
以上のような実行結果となります。
解説
Humanクラス内にsetDataメソッドが3つ定義されています。
それぞれをsetDataメソッド1,2、3としてみました。
1は引数なし。(5~6行目)
2は引数が一つ。型はString型。(7~9行目)
3は引数が二つ。型はString型とint型。(10~13行目)
このように、同じ名前のメソッドでも引数の数や型によって区別して定義することができるのがオーバーロードです。
ではメインメソッドがあるSample12_1クラスをみてみます。
まず21行目でHumanクラスのインスタンス化が行われいています。
すると「h1.メソッド名」でHumanクラスのメソッドが呼び出せます。
22行目のh1.setData();では引数が指定されていないため、setDataメソッド1と対応します。
ここでgetDataメソッドを呼び出すと、nameとageはインスタンス変数の値が入るので、
名前は名無しさんです。年齢は0歳です。
と表示されます。
24行目のh1.setData(“鈴木”);では引数一つ、String型で指定されているので、setDataメソッド2と対応します。
ここでgetDataメソッドを呼び出すと、nameには”鈴木”が入り、ageにはインスタンス変数の0が入るので、
名前は鈴木さんです。年齢は0歳です。
と表示されます。
26行目のh1.setData(“佐藤”, 20);では、引数二つ、String型とint型が指定されているため、setDataメソッド3と対応します。
ここでgetDataメソッドを呼び出すと、nameには”佐藤”、ageには20が入るため、
名前は佐藤さんです。年齢は20歳です。
と表示されます。
以上の仕組みとなっています。
次回はオーバーライドについて説明します。