本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第5章 抽象クラスとインタフェース ― 型で「約束」する · レッスン17

インタフェース ― 「できること」の約束

ブラウザで完結

導入

抽象クラスは「AはBの一種(is-a)」という関係の中で、共通の骨組みを共有する仕組みでした。でも「泳げる」「飛べる」のように、まったく違う種類のクラスに共通の「できること」だけを約束したい 場面もあります。そんなときに使うのが インタフェース です。

説明

インタフェース(interface) は、「このメソッドを持つこと」という約束(契約)だけを定義する型です。中身のあるメソッドは書けません(次のレッスンで学ぶ default メソッドを除く)。クラスがインタフェースの約束を守ることを implements で宣言します。

public class Main {
    public static void main(String[] args) {
        Fish f = new Fish();
        f.swim();
    }
}

interface Swimmable {
    void swim();
}

class Fish implements Swimmable {
    @Override
    public void swim() {
        System.out.println("泳ぐ");
    }
}
  • interface Swimmable { void swim(); } … 「swim() を持つこと」という約束。
  • class Fish implements Swimmable { ... }FishSwimmable の約束を守り、swim() を実装します。インタフェースのメソッドを実装するときは、必ず public をつけます。

抽象クラスとの違いは、インタフェースは「継承関係にない、まったく別のクラス同士」にも共通の「できること」を持たせられる点です。

やってみよう

下のエディタを実行し、FishSwimmable の約束通り swim() を実装していることを確認しましょう。Swimmable を実装する別のクラス(Human など)を追加してみてください。

演習

interface Flyable { void fly(); } を作り、Bird implements Flyablefly()"飛ぶ" と表示するように実装してください。mainnew Bird() を作って fly() を呼んでください。

ヒント1を見る

interface Flyable { void fly(); } を書きます。

ヒント2を見る

class Bird implements Flyable { @Override public void fly() { System.out.println("飛ぶ"); } }

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。