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以外の修飾子を指定することは認められません。
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()」のようなエラーとなります。これはクラスによる実装と同じです。
すべてのインターフェイスは、暗黙的にabstractです。よってabstract修飾子は指定する必要がなく、むしろ指定することは非推奨とされています。
abstract interface MyInterface1 {} // 非推奨 interface MyInterface2 {} // OK
インターフェイスは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
は、オーバーライドのアノテーションです。