Java入門 STEP15|インターフェースを学ぼう

karin@taishi@felmia

インターフェースとは?

STEP14では、共通する処理を親クラスにまとめながら、一部の処理を子クラスに任せる「抽象クラス」について学びました。

Javaには、クラスに「この機能を持たせる」というルールを決める仕組みもあります。

それがインターフェース(interface)です。

例えば、DogとBirdというクラスがあるとします。

犬と鳥は違う種類の動物ですが、どちらも「移動する」という機能を持たせることができます。

このとき、

「move()というメソッドを持つ」

という共通のルールをインターフェースとして定義できます。

インターフェースとは?

クラスに「このメソッドを持たせる」という共通のルールを決めることができます。

そのルールを利用するクラスでは、決められたメソッドを実装します。

ルミィ
ルミィ

「このクラスには、この機能を用意してね!」っていうルールを作れるんだね♪

interfaceを使ってみよう

インターフェースを作るときは、classではなくinterfaceを使います。

public interface Movable {

}

基本的な書き方は次のとおりです。

public interface インターフェース名 {

}

今回は「移動できる」という意味でMovableという名前にしています。

インターフェース名はクラスと同じように自由に付けられますが、Movableのように「~できる」「~可能な」ことが伝わる名前が使われることもあります。

インターフェースにメソッドを定義する

Movableにmove()というメソッドを定義します。

public interface Movable {

    void move();
}

move()には具体的な処理を書いていません。

ここでは、

「Movableを実装するクラスにはmove()を用意する」

というルールを決めています。

また、インターフェースでこのように定義したメソッドには、public abstractが自動的に付くという特徴があります。

void move();

は、実際には次のような意味になります。

public abstract void move();

そのため、インターフェースではpublic abstractを省略して書くことができます。

インターフェースのメソッド

インターフェースでは、実装するクラスに必要なメソッドを決めておくことができます。

具体的な処理は、そのインターフェースを利用するクラス側で作ります。

implementsを使って実装する

クラスでインターフェースを利用するときは、implementsを使います。

public class クラス名 implements インターフェース名 {

}

MovableをDogクラスで実装すると、次のようになります。

public class Dog implements Movable {

    @Override
    public void move() {
        System.out.println("犬が走ります");
    }
}

DogはMovableを実装しているため、move()を定義しています。

ここでもSTEP13で学んだ@Overrideが使われています。

ルミィ
ルミィ

継承ではextendsだったけど、インターフェースではimplementsを使うんだね!

実際に呼び出してみよう

Dogのオブジェクトを作って、move()を呼び出します。

public class InterfaceSample {

    public static void main(String[] args) {

        Dog dog = new Dog();

        dog.move();
    }
}

実行結果

犬が走ります

Dogで実装したmove()が実行されました。

Movableでは「move()を持つ」というルールを決め、具体的にどう移動するのかはDog側で決めています。

Birdでも同じインターフェースを使える

同じMovableをBirdにも実装できます。

public class Bird implements Movable {

    @Override
    public void move() {
        System.out.println("鳥が飛びます");
    }
}

DogとBirdでは、移動の仕方が違います。

Dogは、

犬が走ります

Birdは、

鳥が飛びます

としています。

どちらも処理は違いますが、Movableを実装しているのでmove()を持っているという点は共通しています。

インターフェースは複数実装できる

STEP12では、Javaのクラスがextendsで継承できる親クラスは1つと学びました。

インターフェースには大きな違いがあります。

1つのクラスに複数のインターフェースを実装できます。

例えば、新しくSwimmableを作ります。

public interface Swimmable {

    void swim();
}

DogにMovableとSwimmableの両方を実装する場合は、,で区切ります。

public class Dog implements Movable, Swimmable {

    @Override
    public void move() {
        System.out.println("犬が走ります");
    }

    @Override
    public void swim() {
        System.out.println("犬が泳ぎます");
    }
}

これでDogには、

Movableのmove()

と、

Swimmableのswim()

の両方を実装できます。

複数のインターフェースを実装できる

クラスの継承では、extendsで指定できる親クラスは1つです。

インターフェースは、,で区切ることで複数実装できます。

ルミィ
ルミィ

「走れる」と「泳げる」みたいに、いくつもの機能を持たせることもできるんだ♪

抽象クラスとの違い

STEP14の抽象クラスとインターフェースは、どちらも子クラスや実装クラスにメソッドの実装を任せられるため、最初は違いが分かりにくいかもしれません。

まずは大まかに区別しておきましょう。

抽象クラス

共通する状態や処理を親クラスにまとめながら、一部の処理を子クラスに実装させることができます。

継承にはextendsを使います。

インターフェース

クラスに「この機能を持つ」という共通のルールを決めるために利用できます。

実装にはimplementsを使い、複数のインターフェースを実装することもできます。

例えば、

DogはAnimalの一種

という関係なら、Animalを継承する考え方ができます。

一方、

Dogは移動できる

Birdも移動できる

のように、種類とは別に共通する機能を表したい場合には、Movableのようなインターフェースを利用できます。

この段階では、抽象クラスとインターフェースを完璧に使い分けられなくても大丈夫です。

まずは、

extends → クラスを継承する

implements → インターフェースを実装する

という違いを押さえておきましょう。

よくある間違い

implementsではなくextendsを書いてしまう

クラスがインターフェースを実装するときは、implementsを使います。

public class Dog implements Movable {
}

クラスを継承するときのextendsと混同しないようにしましょう。

必要なメソッドを実装していない

例えば、Movableに、

void move();

が定義されている場合、Movableを実装する通常のクラスではmove()を実装する必要があります。

@Override
public void move() {
    System.out.println("犬が走ります");
}

実装を忘れるとコンパイルエラーになります。

複数実装するときにextendsのように考えてしまう

複数のインターフェースを実装するときは、,で区切ります。

public class Dog implements Movable, Swimmable {
}

implementsを何度も書くわけではありません。

STEP15のまとめ

STEP15のポイント

  • インターフェースは、クラスに共通のルールを決めるために利用できる
  • インターフェースの定義にはinterfaceを使う
  • クラスで実装するときはimplementsを使う
  • 実装するクラスでは、決められたメソッドを実装する
  • 1つのクラスに複数のインターフェースを実装できる
  • extendsはクラスの継承、implementsはインターフェースの実装
  • 抽象クラスとインターフェースには役割の違いがある

最初は、「インターフェースで共通のルールを決めて、それぞれのクラスで具体的な処理を作る」と理解できれば大丈夫です。

ルミィ
ルミィ

STEP15クリア!
クラスの種類が違っても、「この機能を持ってね」って同じルールを作れるんだね♪

次のSTEPへ

次のSTEPでは、ここまで学んだ継承・オーバーライド・抽象クラス・インターフェースにも関係する「ポリモーフィズム(多態性)」について学びます。

例えば、DogとCatがどちらもAnimalを継承している場合、それぞれ別々に扱うだけでなく、Animalという共通の型として扱うことができます。

さらに、同じメソッドを呼び出しても、実際に入っているオブジェクトによって違う処理を実行できます。

ここまで個別に学んできたオブジェクト指向の仕組みが、どうつながっているのかも見えてきます。

→ STEP16「ポリモーフィズムを学ぼう」

学習内容を確認したいときは、Java入門の一覧から各STEPを確認できます。

→ Java入門|初心者が基礎から学べるJava学習ガイド

記事URLをコピーしました