014 継承(オーバーライドされたメソッドの利用) 020 解答例

// Animalクラスの定義
class Animal {
    // makeSoundメソッド
    void makeSound() {
        System.out.println("音を鳴らします");
    }
}

// Dogクラスの定義 (Animalクラスを継承)
class Dog extends Animal {
    // makeSoundメソッドをオーバーライド
    @Override
    void makeSound() {
        System.out.println("ワンワン");
    }
}

// Catクラスの定義 (Animalクラスを継承)
class Cat extends Animal {
    // makeSoundメソッドをオーバーライド
    @Override
    void makeSound() {
        System.out.println("ニャー");
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // Animalクラスのインスタンスを作成
        Animal genericAnimal = new Animal();
        // AnimalクラスのmakeSoundメソッドを呼び出し
        genericAnimal.makeSound();

        // Dogクラスのインスタンスを作成
        Dog myDog = new Dog();
        // DogクラスでオーバーライドされたmakeSoundメソッドを呼び出し
        myDog.makeSound();

        // Catクラスのインスタンスを作成
        Cat myCat = new Cat();
        // CatクラスでオーバーライドされたmakeSoundメソッドを呼び出し
        myCat.makeSound();
    }
}

この例では、Animal クラスには基本の makeSound メソッドがあり、Dog クラスと Cat クラスはそれぞれ makeSound メソッドをオーバーライドしています。それぞれのクラスのインスタンスを作成し、makeSound メソッドを呼び出すと、適切な音が表示されます。

オーバーライド

オーバーライド(Override)は、Javaにおいてサブクラスでスーパークラスのメソッドを再定義する機能です。オーバーライドによって、サブクラスはスーパークラスのメソッドをカスタマイズし、特定の動作を提供できます。オーバーライドは主に継承関係にあるクラスで利用されます。

以下はオーバーライドの基本的なルールです。

  1. オーバーライドするメソッドは、スーパークラスとサブクラスで同じメソッドシグネチャ(メソッド名、引数の型・個数、戻り値の型)を持っている必要があります。
  2. オーバーライドするメソッドは、@Override アノテーションを使用して明示的に指定できます。これはオプションですが、推奨されます。

オーバーライドされたメソッドは、サブクラスのインスタンスで呼び出されると、サブクラスの定義に従って処理が行われます。

オーバーライドにはいくつかのメリットがあります。以下にそのいくつかを挙げてみます。

  1. カスタマイズ可能性: スーパークラスで提供される標準の動作をサブクラスで変更できます。サブクラスはスーパークラスのメソッドを再定義し、自身の特有の動作を追加または変更できます。
  2. ポリモーフィズム: オーバーライドはポリモーフィズムをサポートします。これは、同じメソッド名を使用して異なるクラスのオブジェクトで同じメソッドを呼び出せるという概念です。これにより、共通のインターフェースを提供しつつ、各サブクラスで異なる動作を実現できます。
  3. メンテナンス性: オーバーライドを使用すると、コードのメンテナンスが容易になります。スーパークラスの実装が変更されても、それに依存するサブクラスのメソッドは自動的に新しい実装に適応されます。
  4. 効果的な利用: スーパークラスで汎用的な実装を提供し、サブクラスでその実装を特殊化することができます。これにより、コードの再利用が促進されます。
  5. コードの理解容易性: オーバーライドを使用すると、コードが洗練され、理解しやすくなります。メソッドの名前やシグネチャが一貫しているため、コードがどのように機能するかを容易に把握できます。

ただし、オーバーライドを濫用するとコードが複雑になり、理解しにくくなる可能性があるため、適切に利用することが重要です。

オーバーライドとオーバーロードを混同しないように

注意: オーバーライドとオーバーロードの違いに注意してください。

オーバーライド (Override):

  • サブクラスがスーパークラスの同じメソッド名、引数リスト、および戻り値型を持つメソッドを再定義することです。
  • ポリモーフィズムを実現し、サブクラスでスーパークラスのメソッドをカスタマイズできます。
class SuperClass {
    void exampleMethod() {
        // スーパークラスの実装
    }
}

class SubClass extends SuperClass {
    @Override
    void exampleMethod() {
        // サブクラス独自の実装
    }
}

オーバーロード (Overload):

  • 同一クラス内で、同じメソッド名であっても引数リストが異なるメソッドを複数定義することです。
  • 引数の型や個数が異なる場合に、同じメソッド名を使用して複数のメソッドを作成できます。
class Example {
    void overloadedMethod(int x) {
        // 引数が整数の場合の実装
    }

    void overloadedMethod(String str) {
        // 引数が文字列の場合の実装
    }
}

要点:

  • オーバーライドは異なるクラス間で行われ、ランタイム時に動的に解決されます。
  • オーバーロードは同じクラス内で行われ、コンパイル時に静的に解決されます。

適切に使用することで、クリーンで保守しやすいコードを実現できます。混同せず、用途に合わせて使い分けましょう。

「014 継承」問題集リスト