メインコンテンツにスキップ
モジュール 4 · レッスン 1 / 2コース内の 7/14~15 min
モジュールのレッスン (1/2)

インターフェース

抽象クラスには部分的に実装されたコードとインスタンス フィールドの両方を含めることができますが、Java の インターフェイスは純粋な動作の規約です。インターフェイスは、クラスが「何を」実行できるかを定義しますが、「どのように」実行するかは定義しません。

これにより、操作の定義と実際の実装を完全に切り離すことができます。

インターフェイスの定義 (interface)

interface キーワードを使用します。インターフェイスで宣言されたすべてのメソッドは、暗黙的に public および abstract になります (指定する必要はありません)。

Java
interface Drivable {
    void startEngine();
    void stopEngine();
}

インターフェースの実装 (implements)

クラスは implements キーワードを使用してインターフェイスを実装し、定義されたすべてのメソッドの実装 (本体を含む) を提供する必要があります。

Java
class Motorcycle implements Drivable {
    @Override
    public void startEngine() {
        System.out.println("Rombo del motore acceso!");
    }

    @Override
    public void stopEngine() {
        System.out.println("Motore spento.");
    }
}

インターフェースの利点

  1. 多重継承: Java では、クラスは親クラスを 1 つだけ拡張できますが (単一継承)、複数のインターフェイスを同時に実装できます。
    Java
    class HybridCar implements Drivable, Chargeable { ... }
  2. 分離: インターフェイス タイプを使用して変数を定義できます。そのインターフェイスを実装する任意のオブジェクトをそのような変数に割り当てることができます。
    Java
    Drivable vehicle = new Motorcycle();
    vehicle.startEngine();

インターフェースの定数

インターフェイスでは、フィールドを宣言できます。これらのフィールドは、これらの修飾子を指定しない場合でも、暗黙的に public static final (クラス定数を意味します) になります。したがって、宣言後すぐに初期化する必要があります。

Java
interface PhysicsConstants {
    double GRAVITY = 9.81; // Implicitly public static final
}

デフォルトのメソッド (default)

Java 8 以降では、default キーワードを使用して、インターフェイス内のデフォルト実装でメソッドを定義できるようになりました。これらのメソッドは実装クラスにオーバーライドを強制せず、フォールバック動作を提供します。

Java
interface Logger {
    void log(String message);

    // Default method with a body
    default void logError(String message) {
        log("ERROR: " + message);
    }
}

自分で試してみてください

運動#java.m4.l1.e1
試行回数: 0読み込み中…

void fly() メソッドを使用して Flyable インターフェイスを作成します。次に、Flyable を実装し、Flying を画面に出力する Bird クラスを実装します。

エディターを読み込み中…
ヒントを表示

Flyableでは「void fly();」と書きます。 Bird クラスで、それを `@Override public void fly() { System.out.println('Flying'); でマークするメソッドを実装します。 }`。

3 回の試行後に解決策が利用可能になります

運動#java.m4.l1.e2
試行回数: 0読み込み中…

voiddraw()メソッドを使用してDrawableインターフェースを定義します。次に、Drawable を実装し、Drawing Rectangle を出力する Rectangle クラスを実装します。

エディターを読み込み中…
ヒントを表示

インターフェースに `voiddraw();` を定義します。 Rectangle では、 `@Override public voiddraw() { System.out.println('Drawing Rectangle'); を使用します。 }`。

3 回の試行後に解決策が利用可能になります

運動#java.m4.l1.e3
試行回数: 0読み込み中…

void swim() メソッドを定義して、Swimmable インターフェイスを完成させます。次に、Flyable と Swimmable の両方を実装するように Duck クラスを完成させ、fly() メソッドで Flying を出力し、swim() メソッドで Swimming を出力します。

エディターを読み込み中…
ヒントを表示

Swimmable 内で `void swim();` を宣言します。 「class Duckimplements Flyable, Swimmable」を宣言し、要求された文字列を出力する両方のメソッドを実装します。

3 回の試行後に解決策が利用可能になります