「オーバーロード」と「オーバーライド」の違い
予備知識
| 用語 | 意味 |
|---|---|
| 変数 | プログラミング言語における、値を入れておく箱 |
| 変数の型 | 変数の種類 |
| 関数 | 処理のまとまり。何かを入れると何かを計算して何かを返してくれるやつ |
| 引数(ヒキスウ) | プログラムや関数に渡す値 |
| オブジェクト指向 | 「モノ(どんなやつで、どう動く)」に注目した考え方 |
| クラス | オブジェクト指向で使う概念で「それがどんなものか(設計図)」 |
| メソッド | オブジェクト指向における「操作」を定義したもの。動作としては関数と同じ |
| 継承 | 元ネタから要素を受け継いで、元ネタの特徴を備えた新しいのを作ること |
| 親クラス | クラスの継承の話で出てくるクラスのひとつで、元からあった方(継承元)のクラス |
| 子クラス | クラスの継承の話で出てくるクラスのひとつで、新しく作られた方(継承先)のクラス |
それぞれの用語の意味
| 用語 | 意味 |
|---|---|
| オーバーロード | 引数の数とか型とかが違う、同じ名前の関数を複数個、用意すること |
| オーバーライド | 親クラスにあるメソッドを子クラスで再定義することによって、子クラス上で親クラスのメソッドを上書きすること |
Javaを例に説明します。
オーバーロードは例えば以下のような処理です。
class TestSub{
public static void testMethod(){
System.out.println("テストメソッド その1");
}
public static void testMethod(String str1){
System.out.println("テストメソッド その2");
}
public static void testMethod(Integer int1){
System.out.println("テストメソッド その3");
}
public static void testMethod(Integer int1, Integer int2){
System.out.println("テストメソッド その4");
}
}
//主処理
public class test{
public static void main(String[] args){
//テストメソッド実行
TestSub.testMethod();
TestSub.testMethod("a");
TestSub.testMethod(1);
TestSub.testMethod(1, 2);
}
}
まずは
class TestSub{
public static void testMethod(){
System.out.println("テストメソッド その1");
}
public static void testMethod(String str1){
System.out.println("テストメソッド その2");
}
public static void testMethod(Integer int1){
System.out.println("テストメソッド その3");
}
public static void testMethod(Integer int1, Integer int2){
System.out.println("テストメソッド その4");
}
}
の部分に注目してください。
「TestSub」クラスの中には同じ名前のメソッド「testMethod()」が4個も定義されています。
ただし、それぞれの引数の数や型は違います。
どれ1つとして同じものは ありません。
次に
//テストメソッド実行
TestSub.testMethod();
TestSub.testMethod("a");
TestSub.testMethod(1);
TestSub.testMethod(1, 2);
の部分に注目してください。
呼び出しているメソッドは、すべて「TestSub」クラスで定義されている「testMethod()」メソッドです。
ただし、呼び出すときに指定している引数の数や型が違います。
この処理を実行すると、画面上に
テストメソッド その1
テストメソッド その2
テストメソッド その3
テストメソッド その4
と表示されます。
引数の数や型が一致する「testMethod()」メソッドが実行されていますよね。
このように、引数が違う同じ名前の関数(メソッド)を複数個、定義するのがオーバーロードです。
オーバーライドは例えば……の前に、まずは以下の処理を見てください。
//ピヨ太ママクラス
class PiyotaMama{
public void hissatuwaza(){
System.out.println("ぴよぴよ波!");
}
}
//ピヨ太君クラス
class Piyota extends PiyotaMama{
}
//主処理
public class test{
public static void main(String[] args){
//ピヨ太君クラスのインスタンス「piyota」を生成
Piyota piyota = new Piyota();
//必殺技発射!
piyota.hissatuwaza();
}
}
この処理を実行すると、画面上には
ぴよぴよ波!
と表示されます。
「Piyota」クラスには「hissatuwaza()」メソッドがありません。
その場合は、継承元である「PiyotaMama」クラスで定義されている「hissatuwaza()」メソッドが実行されます。
それを踏まえて、オーバーライドは例えば以下のような処理です。
//ピヨ太ママクラス
class PiyotaMama{
public void hissatuwaza(){
System.out.println("ぴよぴよ波!");
}
}
//ピヨ太君クラス
class Piyota extends PiyotaMama{
public void hissatuwaza(){
System.out.println("ピヨシウム光線!");
}
}
//主処理
public class test{
public static void main(String[] args){
//ピヨ太君クラスのインスタンス「piyota」を生成
Piyota piyota = new Piyota();
//必殺技発射!
piyota.hissatuwaza();
}
}
「PiyotaMama」クラスで定義されている「hissatuwaza()」メソッドが「Piyota」クラス内で再定義されています。
「hissatuwaza()」メソッドは「PiyotaMama」クラスにもあるし「Piyota」クラスにもある状態です。
この処理を実行すると、画面には
ピヨシウム光線!
と表示されます。
「Piyota」クラスの「hissatuwaza()」メソッドが実行されるのです。
このように親クラスで定義されているメソッドを子クラスで再定義することで(子クラス上では)親クラスのメソッドを上書きするのがオーバーライドです。
似ているところ
どちらも同じ関数(メソッド)を複数回、定義する行為です。
また、呼び名が似ています。
違うところ
そんな用語はないかもしれませんが、イメージは
オーバーロード:多重定義
オーバーライド:上書き定義
です。
オーバーロードは引数の違う関数(メソッド)を複数個、定義する行為です。
同じ名前の関数(メソッド)が同時に複数個、存在する状況になります。
一方のオーバーライドは、親クラスのメソッドを子クラスで再定義する行為です。
上書きされるので、同じ名前の関数(メソッド)は存在しない状況になります。






