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は、オーバーライドのアノテーションです。