Java interface

Java interfaceとは、定数と継承クラスが実装すべきメソッドの宣言を集めたものです。クラスが備えるべきインタフェースを簡潔に表現できるうえ、多重継承もできるメリットがあります。

インタフェースとは

インタフェースとは定数とメソッドの宣言だけを集めたものである。Javaにおいてインタフェースの宣言は次の書式で行う。

[public] interface InterfaceName { ... }
public
インタフェースのスコープ(アクセス修飾子)をpublicとして宣言する。
InterfaceName
宣言するインタフェースの名前を指定する。

継承

インタフェースはインタフェースを継承することができる。

interface FooIf {
  void foo();
}
interface ExampleIf extends FooIf {
  /* 定数の定義 */
  /* メソッドの宣言 */
}

多重継承

Javaのクラスは複数のクラスを継承できないが、Javaのインタフェースは複数のインタフェースを継承することができる。複数のインタフェースを継承することを「多重継承」と呼ぶ。

インタフェースを多重継承するには、継承するインタフェースをカンマで区切って、複数のインタフェースを指定する。

interface FooIf {
  void foo();
}
interface ExampleConstants {
  public static final double PI = 3.14;
}
interface ExampleIf extends FooIf, ExampleConstants {
  /* 定数の定義 */
  /* メソッドの宣言 */
}

インタフェースの実装

クラスがインタフェースを継承することを「実装」と呼ぶ。

インタフェースの実装は、implements キーワードを使用する。

class Example implements ExcampleIf {
  public void foo() {
    // do something
  }
}

クラスを継承するときの extends とは異なります。

default

Java SE 7までのインタフェースに定義できるメソッドは抽象メソッドのみであったが、Java SE 8のインタフェースから具象メソッドも定義できるようになった。

Javaのインタフェースで具象メソッドを定義するには、default キーワードを指定する。

public interface ExampleIf {
  void setId(int id);

  default int getId() {
    return 0;
  }
}

インタフェースと抽象クラスの違い

クラスは複数のインタフェースを実装できるが、複数の抽象クラスを多重継承することはできない。

インタフェースと抽象クラスの違い
インタフェース 抽象クラス 具象クラス
多重継承 不可 不可
具象メソッドの定義
インスタンス化 不可 不可

参考文献

ぺけみさお (2013) Javaで定数を定義するには定数クラスを使おう