類似用語

オーバーライドとオーバーロードの違い

はじめに

オブジェクト指向プログラミングで登場する言葉である「オーバーライド」と「オーバーロード」、どちらも「オーバー」がついているので、間違いやすいワードです。

似たような言葉ですが「オーバーライド」と「オーバーロード」は全然違う意味の言葉です。本記事では「オーバーライド」と「オーバーロード」の違いについて解説しています。

簡単に解説

  • オーバーライド(上書き定義):親クラスで定義したメソッドを継承した子クラスで書き換えること
  • オーバーロード(多重定義):クラス内に引数の数や型が異なる同じ名前のメソッドを複数定義すること

オーバーライド(override)

スポンサーリンク

オーバーライドとは

オーバーライド(英:override)とは、オブジェクト指向プログラミングにおいて親クラス(スーパークラス)で定義したメソッドを継承した子クラス(サブクラス)で書き換えることです。

継承とは、クラスが持っている機能(変数やメソッド)を他のクラスに引き継がせることです。次の例は継承のイメージ図です。

継承のイメージ例

親クラスの機能(メソッドA、メソッドB)を継承することで、子クラスは親クラスの機能(メソッドA、メソッドB)を利用できるようになります。

継承したとき、親クラスで定義されているメソッドのままでは使えず書き換えたいときがあります。このようなときにオーバーライドを使用します。

以下は、オーバーライドのイメージ図です。オーバーライドすれば、親クラスのメソッドを子クラスで上書きできます。

オーバーライドのイメージ例

オーバーライドの例

それではオブジェクト指向の言語である「Java」を使い、オーバーライドの例を紹介します。

次の例では、親クラスの「cry」メソッドを子クラスでオーバーライドして、「cry」メソッドの内容を書き換えています。

[親クラス]

/**
 * 動物クラス
 */
public class Animal {

    /**
     * 鳴き声
     */
    public void cry() {
        System.out.println("動物の鳴き声");
    }
}

[子クラス]

/**
 * 猫クラス
 */
public class Cat extends Animal {

    /**
     * 鳴き声
     */
    @Override
    public void Cry() {
        System.out.println("猫の鳴き声はみゃー");
    }
}

[プログラムの実行]

public class MainSample {

    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.cry();
    }
}

[実行結果]

猫の鳴き声はみゃー

プログラムを実行した結果、オーバーライドした子クラスの「cry」メソッドの内容が実行されています。

オーバーロード(overload)

スポンサーリンク

オーバーロードとは

オーバーロード(英:overload)とは、同じクラス内に引数の数や型が異なる同じ名前のメソッドを複数定義することです。また、言語によっては演算子のオーバーロードが可能です。

オーバーロードがないと、同じような機能で引数の型が違うだけの場合でも、違うメソッド名で定義しなければいけません。そして、メソッドを使う人は引数の型によって使うメソッドを選択します。

オーバーロードを使わない場合

オーバーロードを利用すれば、同じメソッド名で定義することができ、メソッドを使う人は引数の型を気にする必要がありません。

オーバーロードを使う場合

オーバーロードの例

それでは、Javaを使いオーバーロードの例を紹介します。

次の例では「add」というメソッド名でオーバーロードしています。

[オーバーロードの例]

public class Calculation {

    public int add(int a, int b) {
        return a + b;
    }

    public int add(int a) {
        return a + 1;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

[プログラムの実行]

public class MainSample {

    public static void main(String[] args) {

        Calculation cal = new Calculation();
        System.out.println("引数2つ(int型)のメソッド:" + cal.add(2,2));
        System.out.println("引数1つ(int型)のメソッド:" + cal.add(10));
        System.out.println("引数2つ(double型)のメソッド:" + cal.add(2.5,1.1));
    }
}

[実行結果]

引数2つ(int型)のメソッド:4
引数1つ(int型)のメソッド:11
引数2つ(double型)のメソッド:3.6

このようにオーバーロードは、メソッドを使う人が "引数の型を意識せずに利用できる"というメリットがあります。

また、オーバーロードを使えば同じような機能に対して、同じ名前のメソッド名がつけられます。

helpful