はじめに
株式会社implの奈良です。
Javaを含むオブジェクト指向のプログラミング言語を学習したばかりの初学者には、オーバーライド(Override)とオーバーロード(Overload)は少し混乱しやすい概念かもしれません。
当該記事ではこの2つのそれぞれの役割について解説します。
オーバーライド(Override)とは
オーバーライドは、スーパークラス(親クラス)のインスタンスメソッドをサブクラス(子クラス)で再定義(上書き)することです。オーバーライドすることで、親クラスから継承したインスタンスメソッドの振る舞いを、子クラスで変更することができます。
// Animal.java
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
// Dog.java
class Dog extends Animal {
@Override
void sound() {
System.out.println("ワンワン");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound(); // "ワンワン" が出力されます
}
}
上記のコードを見てみましょう。
ファイルの構成として下記3ファイルを想定してください。
①Main.java・・・エントリポイント。Dogインスタンスを生成し、Dogインスタンスを用いてsoundメソッドを呼び出す。
②Animal.java・・・動物の鳴き声を出力するスーパークラス
③Dog.java・・・Animalクラスを継承するサブクラス、犬の鳴き声を出力する。
上記では、Animal
クラスに定義されたsound
メソッドを、Dog
クラスでオーバーライドしています。Dog
クラスのsound
メソッドは、Animal
クラスのものとは異なる振る舞い(”Animal makes a sound”ではなく、”ワンワン”と出力される。)をします。
Dog
クラスはAnimal
クラスを継承し、sound
メソッドをオーバーライドすることで、Animal
クラスの一般的な動作(動物の振る舞いとして共通の鳴き声)をDog
クラスの具体的な動作(ワンワンという鳴き声)に変更しています。
Animalクラスには共通の振る舞いをどんどん定義して、DogクラスやCatクラスに、その動物に対応したsoundメソッド(鳴き声)を設定するような使うイメージがわかりやすいと思います。
このようにして、継承とオーバーライドを使用することで、コードの再利用性を高め、柔軟で拡張性のあるプログラムを作成することができます。
オーバーロード(Overload)とは
オーバーロードは、同じメソッド名で複数のメソッドを定義することです。ただし、それぞれのメソッドは異なるパラメータリスト(引数の型や数)を持ちます。オーバーロードを使用すると、同じメソッド名で異なる処理を実行することができます。
// Calculator.java
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(1, 2)); // 3 が出力されます
System.out.println(calc.add(1.0, 2.0)); // 3.0 が出力されます
System.out.println(calc.add(1, 2, 3)); // 6 が出力されます
}
}
ファイルの構成として下記2ファイルを想定してください。
①Main.java・・・エントリポイント。Calculator
クラスのインスタンスを作成し、calc
という変数に代入し、それぞれの引数に対応したaddメソッドを呼び出す。
②Calculator.java・・・異なるパラメータを取る3つのadd
メソッドを持つ計算機のクラス
上記では、Calculator.javaにaddメソッドが3つ定義定義されています。
①int add(int a, int b)、②double add(double a, double b)、③int add(int a, int b, int c)
同名のメソッドは本来定義できないはずですが、引数(パラメータ)の値や数を変更することで、同名のメソッドであっても複数定義できるようになります。
オーバーロードは、同じ名前のメソッドの呼び出しでありながら、その時に使用する型や引数の数に合わせて適切なメソッドを自動的に選択し実行する仕組みといえます。
また、一つの名前で異なる振る舞いを多重的に実現し、その状況に適したメソッドを選択できる性質はポリモーフィズムというため、覚えておくといいでしょう。
まとめ
オーバーライドは親クラスのメソッドを子クラスで再定義することであり、ポリモーフィズム(多態性)を実現するための重要な手段です。
一方、オーバーロードは同じメソッド名で異なる引数リストを持つメソッドを定義することです。これにより、同じメソッド名で異なる操作を行うことができ、コードの可読性と使いやすさが向上します。
オーバーライドとオーバーロードの違いを理解することで、Javaプログラムをより柔軟かつ効果的に設計することができるようになります。是非、実際のコードを書きながらこれらの概念を理解してください。