Java入門25 インターフェースでクラスにメソッドを義務付け

Java入門の第25回です。前回からの続きですが、今回だけでも分かる内容になっています。このシリーズの第1回はこちらです。

今回は、interface(インターフェース)について解説します。インターフェースは、クラスが持つべきメソッドを義務付けることで、クラスを機能拡張する役割を果たします。

interface(インターフェース)とは

インターフェースは、クラスがどんなメソッドを持つべきかを定義したものです。インターフェースを実装したクラスでは、そのインターフェース内で定義されているメソッドを必ず持つ必要があります。

インターフェースは、クラスが持つべきメソッドを義務付けることで、クラスを機能拡張する役割を果たします。説明だけはイメージしづらいので、インターフェースを作成する際の書式を確認してみましょう。

インターフェースの作成

インターフェースは、以下の書式でinterfaceキーワードを使って作成します。

interface インタフェース名 {
    メソッド名;
}

例えば、以下のように書くと、Scoreインターフェースが作成されます。

interface Score {
    void printScore();
}

作成されたScoreインターフェースには、printScore()というメソッドが定義されていますが、具体的な実行内容は書かれていません。

インターフェースの実装

作成したインターフェースは、以下の書式でimplementsキーワードを使って実装します。

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

}

例えば、以下のように書くと、Bunクラスは Scoreインターフェースを実装しことになります。

interface Score {
    void printScore();
}

class Bun implements Score {
    void printScore() {System.out.println("英文学テスト:" + score;}
}

Scoreインターフェースを実装したBunクラスでは、必ずprintScore()というメソッドを定義する必要があります。printScore()メソッドの具体的な実行内容はScoreインターフェース側ではなく、それを実装するクラス側で定義します。

インターフェースを使った実例

以下のコードは、interfaceを使った実例です。

//abstractクラス
abstract class Gakusei {
    public int no;
    public String name;
    //abstractメソッド
    abstract void printName();
}
//Scoreインターフェース
interface Score {
    void printScore();
}

//子クラス
class Bun extends Gakusei implements Score {
    int score;
    void printName() {System.out.println("文" + this.no + ":" + this.name);}
    public void printScore() {
        System.out.println("英文学テスト:" + this.score);
        System.out.println();
    }
}
class Kou extends Gakusei implements Score {
    String score;
    void printName() {System.out.println("工" + no + ":" + name);}
    public void printScore() {
        System.out.println("実験レポート:" + this.score);
        System.out.println();
    }
}
class Tai extends Gakusei {
    void printName() {System.out.println("体" + no + ":" + name);}
}

public class Test30 {
    public static void main(String[] args) {
        //インスタンス生成
        Bun g1 = new Bun();
        Kou g2 = new Kou();
        Tai g3 = new Tai();
        //インスタンス変数への値の代入
        g1.no = 1001; g1.name = "ヤマダ ハナコ"; g1.score = 88;
        g2.no = 2001; g2.name = "スズキ タロウ"; g2.score = "A判定";
        g3.no = 3001; g3.name = "タナカ ジロウ";
        //インスタンスメソッドを呼び出す
        g1.printName(); g1.printScore();
        g2.printName(); g2.printScore();
        g3.printName();
    }
}

上記コードの実行結果は、以下の通りです。

文1001:ヤマダ ハナコ
英文学テスト:88

工2001:スズキ タロウ
実験レポート:A判定

体3001:タナカ ジロウ

上記サンプルはコードが少し長くなりましたが、注目してほしいポイントは2点です。1点目は「interface Score」の部分で、この記述でScoreインターフェースを作成しています。

2点目は「implements Score」の部分で、この記述でScoreインターフェースを実装しています。Scoreインターフェースを実装したクラスは、必ずprintScore()メソッドを持つ必要があります。

インターフェースを実装するメリット

Javaでは親クラスを継承して子クラスを作成できます。親クラスを継承すると親クラスのフィールドやメソッドをすべて引き継いだうえで、さらに機能拡張させた子クラスを作成できます。

ただし、子クラスは親クラスを1つしか持てません。複数の親からそれぞれの特徴を継承してハイブリッドした子クラスが作りたい場面があるかもしれませんが、子クラスは複数の親クラスを持つことはできません。

こうした場合、インターフェースを実装してやることで、親クラスはひとつでもあたかも複数の親クラスを合体させたような、ハイブリッドな特徴や機能を持つ子クラスを作成できます。

次回へ続きます。