🚀

Java Silver 勉強⑦インタフェースによる抽象化

に公開

【出題項目の例】

Javaの基本データ型と文字列の操作
演算子と制御構造
配列の操作
クラスの宣言とインスタンスの使用
メソッドの作成と使用
カプセル化の適用
継承による実装の再利用
インタフェースによる抽象化
例外処理
モジュール・システム

インタフェースによる抽象化

1. インタフェースとは?

インタフェースは、クラスが実装しなければならないメソッドの「設計図」を定義するものです。インタフェース自体は実装を持たず、メソッドのシグネチャ(引数、戻り値など)のみを定義します。クラスは、このインタフェースを実装することで、実際の処理を定義します。

  • インタフェースの特徴:
    • メソッドの実装は持たず、メソッドの宣言のみを行います。
    • 複数のインタフェースを実装することが可能です(多重実装)。
    • クラスは、インタフェースに定義されたすべてのメソッドを実装しなければならない。

2. インタフェースと抽象クラスの違い

インタフェースと抽象クラスの違いは以下の通りです:

特徴 インタフェース 抽象クラス
メソッドの実装 なし (ただし、Java 8以降はdefaultメソッドで実装可能) なし(または部分的にあり)
多重継承 可能 不可能
フィールド(変数) 定義できない(public static finalのみ) 定義可能(インスタンス変数も可)
クラスの継承 クラスは複数のインタフェースを実装できる クラスは1つの抽象クラスしか継承できない

3. インタフェースの定義

インタフェースは interface キーワードを使って定義します。メソッドには実装がなく、シグネチャのみが含まれます。

インタフェースの例

// Animalというインタフェースを定義
interface Animal {
    // 抽象メソッドの宣言(実装は無し)
    void sound();   // 音を出す
    void sleep();   // 眠る
}

4. インタフェースの実装

インタフェースを実装するためには、implements キーワードを使います。インタフェースに定義されたメソッドは、実装するクラスで必ず実装しなければなりません。

インタフェースの実装例

// Animalインタフェースを実装するクラス
class Dog implements Animal {
    // soundメソッドを実装
    public void sound() {
        System.out.println("ワンワン!");
    }

    // sleepメソッドを実装
    public void sleep() {
        System.out.println("犬は寝る");
    }
}

5. インタフェースの使用例

インタフェースは、異なるクラスが共通のメソッドを持つことを保証するために使われます。例えば、異なる動物クラスがそれぞれの方法で sound() を実装する場合、インタフェースを使うことで、どのクラスも sound() メソッドを持つことが保証されます。

使用例

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();  // Dogクラスをインタフェース型で参照
        dog.sound();  // ワンワン!
        dog.sleep();  // 犬は寝る
    }
}

6. インタフェースのメリット

  • 多重継承の代替: クラスは1つの抽象クラスしか継承できませんが、インタフェースは複数実装できるため、より柔軟な設計が可能です。
  • 共通のインタフェースを提供: 異なるクラス間で共通のメソッドを強制できるため、統一された処理を行いたい場合に便利です。
  • 疎結合の設計: インタフェースを利用することで、実装クラスに依存しないコードが書けます。これにより、コードの変更が容易になります。

7. インタフェースの重要ポイント

  • インタフェースはメソッドのシグネチャのみ定義し、実際の処理は実装するクラスに任せる。
  • クラスはインタフェースを実装することによって、そのインタフェースに定義されたメソッドを必ず実装しなければならない。
  • インタフェースは多重継承をサポートしているため、複数のインタフェースを同時に実装できます。

8. 追加機能

Java8から、インタフェースで実装を含むメソッドを定義できるようになりました。
(従来は抽象メソッドのみ宣言可能だった!)

default メソッド()

  • default キーワードを使って、インターフェース内で具象メソッド(実装を含むメソッド)を定義できる
  • 自動的に public が付与される
  • ただし、equals(), hashCode(), toString() のような Object クラスのメソッドは定義できない

static メソッド

  • static キーワードを使って、インターフェース名を使って直接呼び出せる静的メソッドを定義できる
  • デフォルトで public が付与されるが、private にすることも可能
  • 実装クラスでオーバーライドできない

使用方法

  • default メソッドは 実装クラスのインスタンスを使って呼び出す
  • static メソッドは インターフェース名を使って直接呼び出す

ポイント

  1. default メソッドはインターフェースを実装したクラスで使用可能で、オーバーライドもできる。
  2. static メソッドはインターフェース名を使って直接呼び出す必要があり、オーバーライドできない。
  3. default メソッドでは equals(), hashCode(), toString() を定義できない。
  4. static メソッドは private にすることができるが、デフォルトでは public が付与される。

Discussion