Java では抽象クラスと同じようなものをインターフェイス(interface)を使って表すことが出来ます。インターフェイスを利用するときは、インターフェイスの宣言(declaration)が必要になります。また、インターフェイスを宣言するときは「class」の変わりに「interface」と記述します。
interface インターフェイス名{
型名 変数名 = 代入式;
戻り値の型 メソッド名();
}
interface を実装するには「implements」というキーワードが必要になります。
以下が「interface」、「implements」を使用した簡単なプログラムの例です。
interface InterfaceTest {
//抽象メソッド
void inTest();
}
以下は上記の「InterfaceTest」クラスを実装したクラスその一です。
class InTest1 implements InterfaceTest {
private String inTest1;
public InTest1(String str) {
this.inTest1 = str;
}
//抽象メソッド
public void inTest() {
System.out.println("InTest1クラスです。");
System.out.println(inTest1);
}
}
以下は上記の「InterfaceTest」クラスを実装したクラスその二です。
class InTest2 implements InterfaceTest {
private String inTest2;
public InTest2(String str) {
this.inTest2 = str;
}
//抽象メソッド
public void inTest() {
System.out.println("InTest2クラスです。");
System.out.println(inTest2);
}
}
そして、以下が上記のクラスたちを呼び出すメインクラスになります。
public class MainTest {
public static void main(String[] args) {
InterfaceTest inT[] = new InterfaceTest[2];
inT[0] = new InTest1("InTest1クラスのインスタンス。");
inT[1] = new InTest2("InTest2クラスのインスタンス。");
for (int i = 0; i < inT.length; i++) {
inT[i].inTest();
}
}
}
以下が実行結果です。
InTest1クラスです。 InTest1クラスのインスタンス。 InTest2クラスです。 InTest2クラスのインスタンス。
以上の実行結果をみてわかるように、 それぞれのクラスの抽象メソッド(inTest())が適切に呼ばれているのがわかります。
メソッドの定義のみ宣言し、実装を継承したサブクラスに任せるといったことを考えると抽象クラスとインタフェースは似ている役割をはたしていることになります。
しかし、抽象クラスとインターフェイスには以下のような違いがあげられます。