Javaの継承とポリモーフィズムの基本概念

先生

Javaの継承とポリモーフィズムをマスターして、コードをレベルアップしよう!🐶🐱

Javaの継承:コードの再利用性と拡張性を高める

Javaの継承は、既存のクラス(親クラスまたはスーパークラス)の特性を新しいクラス(子クラスまたはサブクラス)が引き継ぐことができる強力なメカニズムです。これにより、コードの再利用性が向上し、より効率的な開発が可能になります。

継承を使用すると、既存のクラスの属性(フィールド)とメソッドを、新しいクラスで再度記述する必要がなくなります。子クラスは、親クラスのすべてのpublicおよびprotectedメンバーを自動的に継承します。また、必要に応じて、子クラスで新しい属性やメソッドを追加したり、親クラスのメソッドをオーバーライド(上書き)したりすることもできます。

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

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

class Dog extends Animal {
    public Dog(String name) {
        super(name); // 親クラスのコンストラクタを呼び出す
    }

    @Override
    public void makeSound() {
        System.out.println("ワン!");
    }

    public void wagTail() {
        System.out.println("しっぽを振る");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("ポチ");
        dog.makeSound(); // ワン!
        dog.wagTail();   // しっぽを振る
    }
}

この例では、DogクラスはAnimalクラスを継承しています。DogクラスはAnimalクラスのnameフィールドとmakeSound()メソッドを継承し、makeSound()メソッドをオーバーライドして、犬特有の鳴き声を出すように変更しています。また、wagTail()という独自のメソッドも追加しています。

Javaのポリモーフィズム:柔軟なコードを実現する

ポリモーフィズム(多態性)とは、同じ名前のメソッドが異なるクラスで異なる動作をすることを意味します。Javaでは、継承とインターフェースを通じてポリモーフィズムを実現できます。

ポリモーフィズムには、主にオーバーロード(Overload)とオーバーライド(Override)の2つの種類があります。

オーバーロードは、同じクラス内で、引数の型や数が異なる同じ名前のメソッドを複数定義することです。

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

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

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

オーバーライドは、子クラスで親クラスのメソッドを再定義することです。上記のDogクラスの例で、makeSound()メソッドをオーバーライドしているのが良い例です。

ポリモーフィズムの重要な利点は、柔軟性の高いコードを記述できることです。例えば、Animalクラスの配列にDogCatなどの異なるクラスのインスタンスを格納し、makeSound()メソッドを呼び出すと、それぞれのクラスに応じた鳴き声が出力されます。

Animal[] animals = new Animal[2];
animals[0] = new Dog("ポチ");
animals[1] = new Cat("タマ");

for (Animal animal : animals) {
    animal.makeSound(); // Dogの場合は「ワン!」、Catの場合は「ニャー!」
}

このように、ポリモーフィズムを使用することで、実行時にオブジェクトの型に基づいて適切なメソッドが呼び出されるため、より柔軟で拡張性の高いプログラムを構築できます。

インターフェースとポリモーフィズム

インターフェースは、クラスが実装すべきメソッドの集合を定義します。クラスは複数のインターフェースを実装できます。インターフェースを使用することで、異なるクラスが共通のインターフェースを実装し、ポリモーフィズムを実現できます。

interface Animal {
    void makeSound();
}

class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("ワン!");
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("ニャー!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal[] animals = new Animal[2];
        animals[0] = new Dog();
        animals[1] = new Cat();

        for (Animal animal : animals) {
            animal.makeSound();
        }
    }
}

この例では、AnimalインターフェースをDogクラスとCatクラスが実装しています。makeSound()メソッドは、Animalインターフェースで定義されており、それぞれのクラスで具体的な実装が異なります。これにより、Animal型の配列にDogCatのインスタンスを格納し、makeSound()メソッドを呼び出すと、それぞれのクラスに応じた鳴き声が出力されます。

参考リンク

まとめ

Javaの継承とポリモーフィズムは、オブジェクト指向プログラミングの重要な概念であり、コードの再利用性、拡張性、柔軟性を高めるために不可欠です。これらの概念を理解し、適切に活用することで、より効率的で保守性の高いプログラムを開発することができます。積極的にコードに取り入れ、その効果を実感してください。