Javaでは同じ名前のメソッドを複数定義することができ、このような記述をオーバーロードと呼びます。
本記事では、初心者向けにJavaのサンプルコードを掲載しながらオーバーロードの使い方と似た名前で勘違いしやすいオーバーライドとの違いについてご紹介していきます。
目次
Javaのオーバーロードって何?
Javaでは、同じ名前で引数の数や型が異なるメソッドを複数定義することをオーバーロードと呼びます。
オーバーロードを利用する理由
オーバーロードは、似た処理を利用したいけれども引数やデータ型などは様々なパターンで使用したいという場合に有効です。
全く異なる名前のメソッドを用意するよりも、同じ名前で引数情報だけを切り替えるオーバーロードを使用することでコードの可読性が高くなります。
オーバーライドとの違い
Javaには、オーバーロードと似た名前で「オーバーライド」という機能も存在します。
オーバーライドはクラスを継承した際、親クラスと同じ名前のメソッドを子クラスで定義し直すことを指します。
オーバーロードが同一クラス間で実施されるのに対し、オーバーライドは継承クラスの間で実施される機能です。
Javaにおけるオーバーロードの使い方
ここからは実際にJavaでのオーバーロードの使い方をご紹介していきます。
記述方法
オーバーロードは、引数の数や型が違う同じ名前のメソッドを記述します。
メソッド名(データ型 変数名) { 処理1; } メソッド名(データ型 変数名, データ型 変数名) { 処理2; } メソッド名(データ型 変数名, データ型 変数名, データ型 変数名) { 処理3; }
例えば下記の記述は全て同名メソッドですがオーバーロード機能により全て有効なメソッドとして利用可能です。
sampleMethod(String var1) { 処理1; } sampleMethod(String var1, int var2) { 処理2; } sampleMethod(int var1) { 処理3; } sampleMethod(int var1, String var2) { 処理4; }
使い方
では実際に使う際はどのように定義するのかというと、利用したいオーバーロードのメソッド引数に一致するように呼び出すだけです。
例えばサンプルとして挙げた「sampleMethod」を上から順番に呼び出す場合
sampleMethod("テスト"); // 処理1 sampleMethod("テスト", 1); // 処理2 sampleMethod(1); // 処理3 sampleMethod(1, "テスト"); // 処理4
それぞれ呼び出し元で定義した引数と合致するオーバーロードメソッドの処理が呼び出されます。
NGパターン
オーバーロードでは、引数の数や型が同じで変数名を変更しただけのメソッドや、戻り値だけが変更されたメソッドなどは定義出来ません。
void sampleMethod(String var1) {}; void sampleMethod(String sample){}; String sampleMethod(String var1) {};
1行目と2行目は型が同じで変数名が異なるだけなのでどちらかしか定義出来ず、1,2行目と3行目は引数が同じで戻り値が異なるだけなのでどちらかしか定義出来ません。
オーバーロードを使用したJavaのサンプルコード
オーバーロードの使い方を確認出来たので、実際のサンプルコードでどのような処理の流れとなるのか紹介していきます。
メソッドのオーバーロード
まずは上述しているメソッドのオーバーロードを簡単なJavaプログラムで動作確認してみましょう。
public class Main { public static void main(String[] args) { Person person = new Person(); person.setInfo("山田"); person.setInfo(30); person.setInfo("佐藤", 24); } } class Person { String name; int age; public void setInfo(String name) { this.name = name; System.out.println("nameを" + name + "に上書きしました。"); } public void setInfo(String name, int age) { this.name = name; this.age = age; System.out.println("nameを" + name + " ageを" + age + "に上書きしました。"); } public void setInfo(int age) { this.age = age; System.out.println("ageを" + age + "に上書きしました。"); } }
実行結果が下記です。
nameを山田に上書きしました。 ageを30に上書きしました。 nameを佐藤 ageを24に上書きしました。
Personクラスに定義された同名メソッドを呼び出していますが、引数毎にそれぞれ対応した処理が呼び出されていることをご確認頂けます。
コンストラクタのオーバーロード
これまでオーバーロードの説明をメソッドで行ってきましたが、コンストラクタに対しても使用することが出来ます。
上記のPersonクラスを修正してコンストラクタのオーバーロードを試してみましょう。
public class Main { public static void main(String[] args) { Person person1 = new Person("山田"); person1.introduce(); Person person2 = new Person(30); person2.introduce(); Person person3 = new Person("佐藤", 24); person3.introduce(); } } class Person { String name; int age; Person(String name) { this.name = name; this.age = 999; } Person(int age) { this.name = "名無し"; this.age = age; } Person(String name, int age) { this.name = name; this.age = age; } public void introduce() { System.out.println("名前は:" + name + " 年齢は:" + age + "です。"); } }
実行結果は下記です。
名前は:山田 年齢は:999です。 名前は:名無し 年齢は:30です。 名前は:佐藤 年齢は:24です。
コンストラクタのオーバーロードでは、初期値を設定することが可能なため、基本は固定値で特定の値を設定したい場合のみ引数として渡すような運用も可能です。
さいごに: Javaのオーバーロードを使ってコードを最適化しよう
本記事では、Javaで利用可能なオーバーロードについてご紹介してきました。
オーバーロードは便利な機能であり、Javaプログラミングでの必須知識の1つです。
オーバーロードとオーバーライドの違いをしっかりと把握した上で、コードを最適化するために積極的に活用していきましょう。
日本語では多重定義と呼ぶこともあるようです。