オーバーロード(Overload)とオーバーライド(Override)は、どちらもJavaのメソッドに関連する概念ですが、それぞれ異なる目的と動作を持っています。以下に、これらの違いを詳しく説明します。
オーバーロード(Overload)
オーバーロードは、同じ名前のメソッドを複数定義することを指しますが、それらのメソッドは異なるパラメータリスト(引数の型や数)を持っています。メソッドのオーバーロードは、同じクラス内で行われます。オーバーロードの目的は、異なる状況に応じて同じ名前のメソッドを使い分けることです。
特徴
- 同じクラス内で行われる。
- メソッド名は同じだが、パラメータリストが異なる。
- 戻り値の型は関係ない(違っていてもよい)。
- コンパイル時にどのメソッドが呼び出されるかが決まる
例
class MathUtils { // 整数の加算 int add(int a, int b) { return a + b; } // 小数の加算 double add(double a, double b) { return a + b; } // 3つの整数の加算 int add(int a, int b, int c) { return a + b + c; } }
オーバーライド(Override)
オーバーライドは、スーパークラス(親クラス)のメソッドをサブクラス(子クラス)で再定義することを指します。オーバーライドの目的は、親クラスから継承したメソッドの動作をサブクラスで変更することです。
特徴
- 継承関係にあるクラス間で行われる(スーパークラスとサブクラス)。
- メソッド名、パラメータリスト、および戻り値の型が全て同じでなければならない。
- アクセス修飾子は親クラスのメソッドよりも広い範囲に設定できるが、狭めることはできない。
- サブクラスで再定義する際に、アノテーション
@Override
を使用するのが一般的(必須ではないが推奨される)。 - 実行時にどのメソッドが呼び出されるかが決まる(ダイナミックバインディング)。
例
class Animal { // スーパークラスのメソッド void makeSound() { System.out.println("美味しそうに食事をしていますね!何の動物かな?"); } } class Dog extends Animal { // オーバーライドされたメソッド @Override void makeSound() { System.out.println("ワン!"); } }
違いのまとめ
- オーバーロード:
- 同じクラス内で行う。
- メソッド名は同じだが、引数の型や数が異なる。
- コンパイル時にどのメソッドが呼び出されるかが決まる。
- オーバーライド:
- 継承関係にあるクラス間で行う。
- メソッド名、引数の型・数、戻り値の型が全て同じ。
- 実行時にどのメソッドが呼び出されるかが決まる。
オーバーロードは多様なメソッドの使用法を提供し、オーバーライドはポリモーフィズムを実現するために重要な役割を果たします。
コメント