インターフェイス (interface)

定義

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

フィールド

インターフェイスのフィールドは、必ず初期化しなければなりません。

interface MyInterface {
    int a = 1; // OK
    int b;     // ERROR : The blank final field b may not have been initialized
}

フィールドは暗黙的にpublic static finalであり、この修飾子は一般的に省略されます。

メソッド

インターフェイスのメソッドには、実装を与えてはなりません。

interface MyInterface {
    void A();   // OK
    void B() {} // ERROR : Abstract methods do not specify a body
}

メソッドは暗黙的にpublic abstractであり、この修飾子は一般的に省略されます。また、public以外の修飾子を指定することは認められません。

継承 (Inheritance)

interface インターフェイス名 extends 継承するインターフェイス名 {
}

このとき継承されたインターフェイスは、継承したインターフェイスにとってもスーパーインターフェイス (superinterface) となります。

クラスの継承とは異なり、インターフェイスの継承は複数のインターフェイスを継承できます。

interface インターフェイス名 extends インターフェイス名1, インターフェイス名2 {
}

インターフェイスの生成

クラスと同様に、new演算子によってインスタンス化できます。たとえばインターフェイスが、

interface MyInterface {
    void A();
}

と定義されているならば、

MyInterface myInterface = new MyInterface() {
    @Override
    public void A() {}
};

myInterface.A();

のように生成して、インターフェイスのメソッドを呼び出せます。

生成時には、すべてのメソッドをオーバーライドする必要があります。さもなくば「The type new MyInterface(){} must implement the inherited abstract method MyInterface.A()」のようなエラーとなります。これはクラスによる実装と同じです。

修飾子 (modifier)

abstract (抽象)

すべてのインターフェイスは、暗黙的にabstractです。よってabstract修飾子は指定する必要がなく、むしろ指定することは非推奨とされています。

abstract interface MyInterface1 {} // 非推奨
interface MyInterface2 {}          // OK

抽象クラス

実装 (implement)

インターフェイスはimplementsキーワードを指定することで、クラスによって実装 (implement) できます。

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

インターフェイスの実装と同時にクラスの継承も行う場合には、必ずextendsを先に記述します。

class クラス名 extends 基本クラス implements インターフェイス名
{
}
interface MyInterface {}
class MyClass {}

class A extends MyClass implements MyInterface {} // OK
class B implements MyInterface extends MyClass {} // ERROR : Syntax error on token "extends", . expected

メソッドのオーバーライド

実装時には、すべてのメソッドをオーバーライドする必要があります。

interface MyInterface {
    void A();
    void B();
}

// OK
class MyClass1 implements MyInterface {

    @Override
    public void A() {}

    @Override
    public void B() {}
}

// ERROR : The type MyClass1 must implement the inherited abstract method MyInterface.B()
class MyClass2 implements MyInterface {

    @Override
    public void A() {}
}

なお@Overrideは、オーバーライドのアノテーションです。

参考

参考書

  • プログラミング言語Java 第4版 [ピアソン・エデュケーション] ケン・アーノルドほか
    4章「インタフェース」、5章「ネストしたクラスとインタフェース」
Javaのドキュメントから検索