[備忘録 その１３] Java Silver ～継承とポリモフィズム その２～

#　抽象クラス
オブジェクト指向プログラミングにおけるクラスの一種で、他のクラスが継承するための基盤を提供します。抽象クラスは、そのクラス自体では直接インスタンス化することはできませんが、サブクラスによって拡張され、具体的な実装が行われることを目的としています。

##　抽象クラスの特徴
１\. __インスタンス化できない__：抽象クラスは直接インスタンス化することができません。インスタンス化するには、そのクラスを継承した具体的なサブクラスを使う必要があります。
２\. __抽象メソッドを持つことができる__：抽象クラスは、抽象メソッドを含むことができます。抽象メソッドは、サブクラスで必ずオーバーライドしなければならないメソッドで、メソッド本体をもたず、宣言のみが行われます。
３\. __具体的なメソッドも持つことができる__：抽象クラスには、具体的な実装されたメソッドも含めることができます。サブクラスはこれらのメソッドをそのまま利用するか、必要に応じてオーバーライドすることができます。
４\. __ポリモーフィズムの基盤__：抽象クラスは、共通のインターフェースを提供することで、異なるサブクラスが同じメソッドを持つことを保証し、ポリモーフィズムを実現するための基盤となります。

```java
abstract class Animal {
    // 抽象メソッド
    abstract void makeSound();

    // 具体的なメソッド
    void sleep() {
        System.out.println("Sleeping...");
    }
}

class Dog extends Animal {
    // 抽象メソッドの実装
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    // 抽象メソッドの実装
    void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound(); // "Bark" を出力
        dog.sleep(); // "Sleeping..." を出力

        Animal cat = new Cat();
        cat.makeSound(); // "Meow" を出力
        cat.sleep(); // "Sleeping..." を出力
    }
}
```

##　インターフェース
オブジェクト指向プログラミングにおける設計ツールの一つで、クラスが実装しなければならないメソッドの集合を定義します。インタフェース自体にはメソッドの実装は含まれず、メソッド名、引数、戻り値の型のみ定義をします。インターフェすを実装するクラスは、そのインターフェースで定義されたすべてのメソッドを実装する必要があります。

###　インターフェースの特徴
１\.　__メソッドの宣言のみ__：インターフェースには、メソッドの本体ではなく、メソッドの宣言（シグネチャ）だけが記述されます。実装はそのインターフェースを実装するクラスに委ねられます。
２\.　__多重継承のサポート__：クラスは複数のインターフェースを実現できるため、インターフェースを使うことで、Javaのような単一検証の言語でも多重継承のような効果を得ることができます。
３\.　__共通の契約を提供__：インターフェースは、異なるクラスが同じ一連のメソッドを実現することを保証します。これにより、異なるクラスのインスタンスを同じインタフェース型で扱えるようになります。
４\.　__実装の分離__：インターフェースは、実装から仕様を分離します。インタフェースを通じて、クラスがどのような機能を提供するかを定義し、具体的な実装方法をクラスに委ねます。

```java
interface Animal {
    // メソッドの宣言
    void makeSound();
    void sleep();
}

class Dog implements Animal {
    // Animalインターフェースのメソッドを実装
    public void makeSound() {
        System.out.println("Bark");
    }

    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

class Cat implements Animal {
    // Animalインターフェースのメソッドを実装
    public void makeSound() {
        System.out.println("Meow");
    }

    public void sleep() {
        System.out.println("Cat is sleeping");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound(); // "Bark" を出力
        dog.sleep(); // "Dog is sleeping" を出力

        Animal cat = new Cat();
        cat.makeSound(); // "Meow" を出力
        cat.sleep(); // "Cat is sleeping" を出力
    }
}
```

###　インターフェースのメソッドの特徴
1\.__宣言のみ__:インタフェース内で定義されるメソッドは、通常、シグネチャ（メソッド名、引数、戻り値の型）のみが記述され、メソッドの本体（実装）はありません。メソッドは本体は、インタフェースを実現するクラスで提供されます。
２\.__暗黙的なpublic修飾子__:Javaでは、インタフェースのメソッドは暗黙的にpublicであり、修飾子を書く必要がありません。また、インタフェース内のメソッドはすべてabstractとして扱われます。
３\.__実装を強制する__:インタフェースを実装するクラスは、インタフェースで宣言されたすべてのメソッドを具体的に実装する必要があります。実装しない場合、そのクラスは抽象クラスとして定義する必要があります。
４\.__デフォルトメソッド__:インタフェースにはdefaultキーワードを使って、デフォルトの実装を持つメソッドを定義することが可能になりました。これにより、新しいメソッドを追加しても既存の実装を影響を与えずに機能を拡張できます。
５\.__静的メソッド__:インタフェースはstaticメソッドを含むことができます。これにより、インタフェース自体で特定の機能を提供することができます。

```java
interface Animal {
    // 通常のインターフェースメソッド（暗黙的にpublic abstract）
    void makeSound();

    // デフォルトメソッド（Java 8以降）
    default void sleep() {
        System.out.println("Sleeping...");
    }

    // 静的メソッド（Java 8以降）
    static void breathe() {
        System.out.println("Breathing...");
    }
}

class Dog implements Animal {
    // インターフェースメソッドを実装
    public void makeSound() {
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // "Bark" を出力
        dog.sleep(); // "Sleeping..." を出力 (デフォルトメソッド)
        
        Animal.breathe(); // "Breathing..." を出力 (静的メソッド)
    }
}
```

最初のページ
[[備忘録 その１] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/9fcf3a2cb4a7162aafcf "[備忘録 その１] Java Silver ～Javaプログラミング基礎～")

前のページ
[[備忘録 その１２] Java Silver ～継承とポリモフィズム その１～](https://qiita.com/MagicShowTime/items/ed70f8e5917ca0c2f757 "[備忘録 その１２] Java Silver ～継承とポリモフィズム その１～")

次のページ
[[備忘録 その１４] Java Silver ～継承とポリモフィズム その３～](https://qiita.com/MagicShowTime/items/5ed80b2f799c2ae48033 "[備忘録 その１４] Java Silver ～継承とポリモフィズム その３～")