インターフェース(Interface)

インターフェースは公開するメソッドを定義した一種の特別なクラスです。

インターフェースについて

インターフェースを使用することで、異なるクラスに共通の振る舞いを強制することができ、システムの作りの統一感を図ることができます。
標準APIにも多くのインターフェースが定義されています。

インターフェースは処理が実装されていないため、インスタンス化はできません。
インターフェースを実装した実装クラスを作成して使用します。

Java SE8以降のインターフェース

Java SE8、SE9でインターフェースに大きな仕様変更が行われました。
Java SE7までは抽象メソッドとstatic定数のみしか定義できませんでしたが、
Java SE8以降ではデフォルトメソッドと静的メソッドが定義できるようになりました。
SE9からはさらにprivateメソッドも定義できるようになりました。

【インターフェースに定義できる要素】
~JavaSE7抽象メソッドとstatic定数のみ
JavaSE8~追加で実装メソッドが定義できる
(デフォルトメソッドと静的メソッドのみ)
JavaSE9~追加でprivateメソッドが定義できる

本記事ではJava8以降の仕様で解説します。

インターフェース構文

インターフェースの構文です。

(構文)
[修飾子] interface インターフェース名 { }

他に定義されたインターフェースを元にサブインターフェースを定義することもできます。
カンマで区切ってインターフェースを複数指定可能です。

(他のインターフェースを継承して作成する場合の構文)
[修飾子] interface インターフェース名 extends 他インターフェース1[, …] { }

インターフェースのサンプル

インターフェースを定義するには、interfaceキーワードを使用します。
インターフェース内には定数、抽象メソッド、デフォルトメソッド、静的メソッド、privateメソッドが定義できます。


public interface SampleInterface {

  //定数の宣言
  String HELLO = "Hello";

  //抽象メソッドの宣言
  String getName(String name)

  //デフォルトメソッドの宣言(SE8以降で可)
  default int defaultMethod1(int a) {
    //メソッドの実装
  }

  //静的メソッドの宣言(SE8以降で可)
  static int staticMethod1(int a, String b) {
    //メソッドの実装
  }

  //privateメソッドの宣言(SE9以降で可)
  private int privateMethod1(String a) {
    //メソッドの実装
  }

}
【インターフェースに定義できる要素】
要素解説
static定数インターフェースのフィールドに宣言した変数は強制的にstatic定数になります。
(public static final修飾子が自動的に付与された状態)
抽象メソッド
(abstract method)
インターフェース内で実装が無いメソッドを定義すると自動的に抽象メソッドになります。
(public abstract修飾子が自動的に付与された状態)
デフォルトメソッド
(default method)
JavaSE8から定義できるようになりました。
指定できる修飾子はpublicのみです。
(未指定の場合は強制的にpublicになります)
equals()、toString()、hashCode()の3つは定義できません。
静的メソッド
(static method)
JavaSE8から定義できるようになりました。
指定できるアクセス修飾子はpublicのみです。
(未指定の場合は強制的にpublicになります)
privateメソッド
(private method)
JavaSE9から定義できるようになりました。
defaultメソッドから共通的に呼ばれる処理などを定義します

インターフェースの実装サンプル

以下、上記インターフェースの実装クラスを定義した例です。
インターフェースを実装するには、implementsキーワードを使用します。

(例)SampleInterfaceを実装したSampleClassを定義する

public class SampleClass implements SampleInterface {
  @Override
  public String getName(String name) {
    return HELLO + name;
  }
}

インターフェースに定義された抽象メソッドはオーバーライドして処理を実装します。
上記例にある「@Override」はアノテーションと呼ばれるもので、抽象メソッドをオーバーライドしていることを明示するためのものです。

@Overrideアノテーションの記述は必須ではありませんが、オーバーライドしたつもりがメソッド名をタイプミスしていて実際にはオーバーライドされていなかったなどのミスを防げるため指定することをおすすめします。

また、インターフェースを複数指定して実装することも可能です。
インターフェースを複数指定する場合は、インターフェース名をカンマで区切って指定します。

(例)SampleInf1とSampleInf2を実装したSampleClassを定義する

public class SampleClass implements SampleInf1, SampleInf2  {
  // 実装
}

インターフェースまとめ

  • インターフェイスはインスタンス化できない。
  • Java SE7以前は、static定数と抽象メソッドのみが定義可能。
  • Java SE8以降は、加えてデフォルトメソッドと静的メソッドが定義可能。
  • Java SE9以降は、加えてprivateメソッドが定義可能。
  • インターフェースの実装クラスを定義するにはimplementsキーワードを使用する。
  • implements時は、複数のインターフェースを指定することが可能。

コメント

タイトルとURLをコピーしました