javaでプログラミングしていると必ずと言っていいほど「オーバーロード」や「オーバーライド」という言葉が出てきます。復習も兼ねて今回は両者の違いについて整理してみます。
オーバーロードとは
- 同一クラス内の同一メソッド名で、「引数の型」、「引数の数」、「引数の並び順」のいずれかが異なるメソッドを複数定義すること。
- 同一クラス内の同一メソッド名でも「戻り型」、「アクセスレベル」、「引数名」、「throws節」が不一致している場合はオーバーロードとは見做されないのでコンパイルエラーになります。
Javaでのオーバーロード実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class OverLoadSample{ /** * <p>[概 要] オーバーロードサンプルメソッド1</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param lang プログラミング言語 */ public static void dispMessage(String lang){ System.out.println("得意なプログラミング言語は「" + lang + "」です。"); } /** * <p>[概 要] オーバーロードサンプルメソッド2</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param country 国名 * @param lang プログラミング言語 */ public static void dispMessage(String country, String lang){ System.out.println("私の母国は「" + country + "」です。"); System.out.println("得意なプログラミング言語は「" + lang + "」です。"); } } |
JUnit
1 2 3 4 5 6 7 8 9 10 |
import org.junit.Test; public class OverLoadSampleTest { @Test public void dispMessageTest() { // 「オーバーロードサンプルメソッド1」の実行 OverLoadSample.dispMessage("JavaScript"); // 「オーバーロードサンプルメソッド2」の実行 OverLoadSample.dispMessage("日本", "JavaScript"); } } |
実行結果(コンソール)
得意なプログラミング言語は「JavaScript」です。
私の母国は「日本」です。
得意なプログラミング言語は「JavaScript」です。
オーバーライドとは
- 親クラス(スーパークラス)で定義されているインスタンスメソッドを、子クラス(サブクラス)で再定義すること。
- 親クラス(スーパークラス)のメソッドを変更することは出来ませんが、子クラス(サブクラス)に特化した機能を付与する事は可能です。
- アクセス修飾子が「private」以外でオーバーライドは適用対象となります。(例:「public」・「protected」)
- オーバーライドする側はオーバーライドされる側と「戻り型」、「メソッド名」、「引数型」、「引数の数」が全て一致する必要があります。どれか一つでも異なる場合はオーバーライドとは見做されません。
Javaでのオーバーライド実装例
スーパークラス(親クラス)
1 2 3 4 5 6 7 8 9 10 11 |
public class OverRideParent{ /** * <p>[概 要] オーバーライドサンプル スーパークラス用メソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param lang プログラミング言語 */ public static void dispMessage(){ System.out.println("得意なプログラミング言語はCです。"); } } |
サブクラス(子クラス)
1 2 3 4 5 6 7 8 9 10 11 |
public class OverRideChild1 extends OverRideParent{ /** * <p>[概 要] オーバーライドサンプル サブクラス用メソッド1</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param lang プログラミング言語 */ public static void dispMessage(){ System.out.println("得意なプログラミング言語はJavaです。"); } } |
1 2 |
public class OverRideChild2 extends OverRideParent{ } |
JUnit
1 2 3 4 5 6 7 8 9 10 |
import org.junit.Test; public class OverRideSampleTest { @Test public void dispMessageTest() { // 「オーバーロードライドサブクラス用メソッド1」の実行 OverRideChild1.dispMessage(); // 「オーバーロードライドサブクラス用メソッド2」の実行 OverRideChild2.dispMessage(); } } |
実行結果(コンソール)
得意なプログラミング言語はJavaです。
得意なプログラミング言語はCです。