Javaインターフェース(Interface)

インターフェース(interface)は、定数とメソッド宣言の集合です。インターフェースを利用することで、完全な抽象化を行うことができます。インターフェースはクラスに似ていますが、インスタンス変数を持たず、すべてのメソッドが抽象メソッドとして宣言されます。つまり、インターフェースは抽象メソッドと定数だけを持ちます。

インターフェースに存在するすべてのメンバー変数は定数として使用され、すべてのメソッドは抽象メソッドです。したがって、すべての変数にfinal staticを付けたり、宣言されるメソッドにabstractキーワードを付けたりする必要はありません。また、抽象クラスと同じようにインスタンスを生成できません。

インターフェースはなぜ使うのか?

このようなインターフェースはなぜ使うのでしょうか。Javaでは、クラス継承は一つの上位クラスしか持てません。つまり、Javaは多重継承(multiple inheritance)をサポートしていません。これに対して、C++のような言語では多重継承が可能です。そのため、完全な多重継承ではありませんが、多重継承に似た形で実装できます。もう一つの理由は、機能の統一のためです。複数のクラスのメソッドを統一し、機能だけを異なる形で実装したい場合があります。このときインターフェースを使うと、インターフェースを同じデータ型として宣言し、異なるクラスでオブジェクトを宣言して、同じメソッドを呼び出しても異なる機能が動作する効果を得られます。

インターフェース定義

インターフェースはクラスと似た形で定義されます。

public interface インターフェース名 [extends インターフェース名, ...] {
   // 定数宣言
   // メソッド宣言
}

インターフェースのすべてのメソッドのアクセス修飾子はpublicなので、別途宣言しなくてもかまいません。

インターフェース内には変数とメソッドだけが宣言され、宣言されたすべての変数はfinal static属性を持ちます。メソッドには基本的にpublicアクセス修飾子が含まれています。

すべてのインターフェースは独立してインスタンスを生成できません。必ず派生クラスでインターフェースのメソッドを再定義した後、派生クラスのインスタンスを通じて使用する必要があります。

インターフェースの使用

クラスでインターフェースを使用するには、implementsキーワードを使います。次は、インターフェースを含むクラスの構文形式です。implementsextendsキーワードとは異なり、複数のインターフェースを列挙して多重継承のような実装を行えます。クラスに一つ以上のインターフェースを実装する場合、インターフェースはカンマ(,)で区切ります。

[public/final/abstract] class クラス名 extends 上位クラス名 implements インターフェース名[, インターフェース名, ...] {
    // メンバー変数
    // コンストラクタ
    // メソッド
    // インターフェースに宣言されたすべてのメソッドをオーバーライドして必ず宣言
}

インターフェースが使用された場合、使用されたインターフェースに定義されたすべてのメソッドがクラス内で必ずオーバーライドされ、実装されなければなりません。また、インターフェースのメソッドを再定義するときは、必ずpublicアクセス修飾子を指定する必要があります。

インターフェース間の継承

インターフェースもクラスと同じように、他のインターフェースを継承できます。インターフェースの継承にもextendsキーワードを使用します。

public interface インターフェース名 extends インターフェース名[, インターフェース名, ...] {
    // 定数宣言
    // メソッド宣言
}

インターフェースはクラスと同じように階層構造を持てます。クラスは一つの上位クラスだけを継承できますが、インターフェースは複数のインターフェースを継承できます。