Java入門

【Java入門】インタフェース(implements)

2021年5月4日

はじめに

前回の記事では、Javaの抽象クラス(abstract)について紹介しました。

本記事では、Javaのインタフェースについて紹介します。

インタフェースとは

インタフェースとは、抽象メソッドと定数だけを定義できるものです。

抽象メソッドとは、定義だけで処理を書かないメソッド、定数とは値が決まっていて変化しないもの(final修飾子をつけると値を変更できなくなる)のことです。

次はインタフェースの例です。インタフェースはクラスではないので「class」ではなく「interface」と書きます。

インタフェースの書き方

インタフェースを利用するときは「implements(読み:インプリメンツ)」を使用します。implementsの右側にインタフェース名を指定することで、指定したインタフェースを使えます。

インタフェースをimplementsする

複数のインタフェースを使用する場合は、カンマ区切りで指定します。

複数のインタフェースを利用

また、インタフェースで定義した抽象メソッドは、サブクラスで必ず実装しなければいけません。サブクラスで抽象メソッドを実装しないとコンパイルエラーが発生します。

オーバーライドしないとエラーになる

インタフェースの実装例

それでは、実際にソースコードでインタフェース(implements)の使用例を紹介します。

スポンサーリンク

次の例では、コンテンツをコントロールするインタフェース「IController」に抽象メソッドを3つ定義しています。

[インタフェース]

/**
 * コンテンツをコントロールするインタフェース
 */
public interface IController {
    /**
     * 一時停止
     */
    void pause();
    /**
     * 再生
     */
    void play();
    /**
     * 停止
     */
    void stop();
}

そして、インタフェースをimplementsした動画クラス「VideoController」と画像クラス「ImageController」にインタフェースで定義した抽象メソッドをオーバーライドして処理を実装しています。

[インタフェースをimplementsした動画クラス]

/**
 * 動画コンテンツをコントロールするクラス
 */
public class VideoController implements IController {
    /**
     * 一時停止
     */
    @Override
    public void pause() {
        System.out.println("動画の再生を一時停止する");
    }
    /**
     * 再生
     */
    @Override
    public void play() {
        System.out.println("動画を再生する");
    }
    /**
     * 停止
     */
    @Override
    public void stop() {
        System.out.println("動画の再生を停止する");
    }
}

[インタフェースをimplementsした画像クラス]

/**
 * 画像コンテンツをコントロールするクラス
 */
public class ImageController implements IController {
    /**
     * 一時停止
     */
    @Override
    public void pause() {
        // 処理なし
    }
    /**
     * 再生
     */
    @Override
    public void play() {
        System.out.println("画像を再生する");
    }
    /**
     * 停止
     */
    @Override
    public void stop() {
        System.out.println("画像の再生を停止する");
    }
}
インタフェースを使うことで、クラスの構成が同じになり書き方が統一されました。
なるほど!ただ、抽象クラス(abstract)と似ているような・・・

インタフェースと抽象クラスって何が違うのですか?

インタフェースと抽象クラス(abstract)の違い

インタフェースと抽象クラスは役割が違います。

インタフェースの役割

インタフェースとは、ものごとの境界となる部分(接点)を表す言葉です。

インタフェースのイメージ図

このインタフェースの意味のとおり、インタフェースには外部からクラスを呼び出すときの接点となるメソッド(抽象メソッド)を定義します。

そのためアクセス修飾子はpublicのみとなっており、外部から使われることを前提としています。

また、インタフェースは多重継承できます。

抽象クラスの役割

抽象クラスは継承関係にあり、スーパークラス(親クラス)の機能をサブクラス(子クラス)で再利用(引き継ぐ)したいときに使用します。

そのため抽象クラスには、抽象メソッド以外にも通常クラスと同じメンバ(フィールドとメソッド)を作成できます。

そして、アクセス修飾子にはpublicとprotectedが指定できます。protectedを指定することで、同じパッケージ内か継承関係で利用でき、外部から使われることを前提しているインタフェースとは違い、どちらかといえば内部向けの機能です。

また、抽象クラスは多重継承できません。

インタフェースと抽象クラスの違いまとめ

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

抽象クラスインタフェース
メンバ(フィールド、メソッド)何でも作れる定数と抽象メソッドのみ(java8からはdefaultとstaticメソッドも作れる)
継承多重継承不可多重継承可
アクセス修飾子public,protectedpublicのみ

スポンサーリンク

インタフェース その他の機能

インタフェースの継承

インタフェースはクラスのように継承できます。インフェースの継承はクラスと同じで「extends」を使用します。

インタフェースの継承

また、インタフェースは抽象クラスとは違い、複数継承できます。複数継承する場合はカンマ区切りで指定します。

インタフェースを複数継承する

デフォルトメソッド

Java8からインタフェースには、デフォルトメソッドとstaticメソッドが定義できます。

デフォルトメソッドはメソッドに「default」を付与します。そして、デフォルトメソッドとstaticメソッドには、処理内容を記述できます。

インタフェースに処理が書けるようになったということは、抽象メソッドとの違いがますます分かりづらいですね・・・
Java7とJava8の互換性のためにできたメソッドといわれています。

以下はデフォルトメソッドとstaticメソッドの例です。

[インタフェースの例]

public interface ISample {
    /**
     * デフォルトメソッド
     */
    public default void defaultPrint() {
        System.out.println("デフォルトメソッドの処理");
    }
    /**
     * staticメソッド
     */
    public static void staticPrint() {
        System.out.println("staticメソッドの処理");
    }
    /**
     * 抽象メソッド
     */
    void start();
}

そして、「SampleA」クラスがインタフェース「ISample」をimplementsしています。

インタフェースをimplementsしたクラスにデフォルトメソッドとstaticメソッドをオーバーライドする必要はありません。抽象クラスのみオーバーライドして実装します。

[インタフェースをimplementsしたクラス]

public class SampleA implements ISample{
    /**
     * 開始処理
     */
    @Override
    public void start() {
        System.out.println("startメソッドの処理");
    }
}

最後に「SampleMain」クラスでインタフェースのデフォルトメソッドとstaticメソッド、オーバーライドした「start」メソッドを実行しています。

[プログラムの実行]

public class SampleMain {

    public static void main(String[] args) {
        SampleA sample = new SampleA();
        sample.start();
        sample.defaultPrint();
        ISample.staticPrint();
    }
}

[実行結果]

startメソッドの処理
デフォルトメソッドの処理
staticメソッドの処理

終わりに

本記事では、Javaのインタフェースについて紹介しました。

次回の記事では、Javaのstatic変数とstaticメソッドについて紹介します。

helpful