🔗 インターフェースの基本

インターフェースは、「クラスが持つべきメソッドの抽象的な定義」だけを記述する参照型です。

特徴

  • 実装を持たないメソッド: Java 8以降の例外を除き、インターフェース内のメソッドはすべて抽象メソッドabstract)であり、メソッド名、引数、戻り値の型だけが定義され、具体的な処理内容(本体)は持ちません。
  • 定数: フィールドはすべて定数public static final)として扱われます。
  • 多重実装: Javaのクラスは単一継承ですが、複数のインターフェースを実装することができます(多重実装)。これにより、複数の異なる振る舞いを一つのクラスに持たせることが可能です。

定義と実装

定義(Interface)

Java

// インターフェースの定義
public interface Movable {
    // 抽象メソッド(public abstractが自動で付く)
    void move(int x, int y); 
    
    // 定数(public static finalが自動で付く)
    int MAX_SPEED = 100;
}

実装(Implement)

インターフェースの機能を利用するクラスは、implementsキーワードを使ってそのインターフェースを実装します。

Java

// Movableインターフェースを実装する
public class Car implements Movable {
    
    // インターフェースで定義された抽象メソッドを必ずオーバーライドして実装する必要がある
    @Override
    public void move(int x, int y) {
        System.out.println("車が (" + x + ", " + y + ") に移動しました。");
        System.out.println("最高速度は: " + MAX_SPEED + " km/h です。"); // 定数の利用
    }
}

🤝 2. インターフェースの役割とメリット

2.1. 契約とルールの強制

インターフェースを実装するクラスは、インターフェースに定義されているすべての抽象メソッドを実装する義務が生じます。これにより、「この機能が必要だ」という契約を強制できます。

例え: 「Printable」インターフェースを実装するすべてのクラスは、必ず「print()」メソッドを持っていなければならない、というルールを課せます。

2.2. 多態性(ポリモーフィズム)の実現

インターフェースは、として使用できます。これにより、異なるクラスのオブジェクトを同じインターフェース型として扱うことができます。

Java

// Movableインターフェース型の変数としてCarオブジェクトを受け入れる
Movable item = new Car(); 

// 呼び出し側はitemがCarであることを知らなくても、move()メソッドを呼び出せる
item.move(10, 20); 

// もし別のクラス Airplane が Movable を実装していれば、以下も可能になる
// Movable item2 = new Airplane();

呼び出し側は、具体的なクラス名(CarAirplane)を意識することなく、共通のMovableという型で操作できるため、結合度が低く、変更に強い柔軟なコードになります。

2.3. 多重実装の許可

前述の通り、Javaは単一継承ですが、複数のインターフェースを実装できます。

Java

public class HybridCar implements Movable, Controllable {
    // MovableのメソッドとControllableのメソッドの両方を実装する必要がある
    // ...
}

これにより、クラスは複数の「役割」や「能力」を同時に持つことができ、機能の組み合わせが柔軟になります。


⚙️ 3. Java 8以降の機能拡張

Java 8以降、インターフェースに新しい機能が追加されました。

3.1. default メソッド

インターフェースにメソッド本体を持つことができるようになりました。

  • defaultメソッドは、インターフェースに新しいメソッドを追加する際に、すでに実装済みのクラスを壊さない(既存クラスに影響を与えない)ために導入されました。
  • 実装クラスは、defaultメソッドをオーバーライドしても良いし、しなくても構いません。

3.2. static メソッド

インターフェースに、そのインターフェースに関連するユーティリティ機能などを提供する静的メソッドstatic)を定義できるようになりました。これは、クラス名を通じて呼び出されます。

項目クラス (abstract classなし)抽象クラス (abstract class)インターフェース (interface)
インスタンス化⚪︎ 可能✕ 不可能✕ 不可能
多重継承/実装✕ 単一継承のみ✕ 単一継承のみ⚪︎ 多重実装が可能
目的オブジェクトの設計図共通部分を持つ親クラス契約・役割の定義