インターフェイス (interface)

定義

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

フィールド

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

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

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

メソッド

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

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

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

継承 (Inheritance)

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

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

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

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

インターフェイスの生成

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

interface Foo {
    void A();
}

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

Foo foo = new Foo() {
    @Override
    public void A() {}
};

foo.A();

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

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

修飾子 (modifier)

abstract (抽象)

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

abstract interface Foo {} // 非推奨
interface Bar {}          // OK

抽象クラス

実装 (implement)

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

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

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

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

class A extends Bar implements Foo {} // OK
class B implements Foo extends Bar {} // NG : Syntax error on token "extends", . expected

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

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

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

// OK
class Bar implements Foo {

    @Override
    public void A() {}

    @Override
    public void B() {}
}

// NG : The type Bar must implement the inherited abstract method Foo.B()
class Baz implements Foo {

    @Override
    public void A() {}
}

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

参考

参考書

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