Chapter 16

Java インターフェース

おでん
おでん
2021.08.18に更新

インターフェースとは

インターフェースとは、直訳すると「接点」です。
まずは、実生活で考えてみます。
例えば、エアコンの温度調整する際に、私たちはリモコンを使用して操作します。
エアコンが変わった場合、細かい操作は変われど、私たちはリモコンの温度調整操作が大体わかります。
つまり、「▲」を押すと温度を上げられ、「▼」を押すと温度を下げられるということが分かっています。
これは、エアコンのリモコンには「▲」「▼」という共通のボタン操作があるためです。

このように、オブジェクトを利用する際に、共通の仕様をまとめているものをインターフェースと言います。

ポリモフィズムとは

インターフェースによって共通の仕様を実装することで、一定の機能を備えた上で、オブジェクトごとの機能を実装することができます。
例で言うと、エアコンやリモコンにはそれぞれの商品ごとに温度調整以外の異なる機能を実装できます。
このように、共通のインターフェースを持つ操作でもオブジェクトごとに異なる操作ができることをポリモフィズムと言います。
ポリモフィズムの直訳は「多様性」です。
インターフェースの実装によってポリモフィズムが実現できることは、オブジェクト指向の大きな特徴の一つです。

インターフェースの宣言

インターフェースの宣言は以下の書式で記述します。

アクセス修飾子 (abstract) interface インターフェース名 {}

※abstractは省略可

インターフェースは抽象クラスと同じように、インスタンス化はできません
変数は、定数しか定義できません。
メソッドは、抽象メソッドしか定義できず、通常メソッドは定義できません。
インターフェースで宣言する変数と抽象メソッドは、クラスのメンバとは異なるため、初期化する必要があります
また、変数にも抽象メソッドにも、暗黙的に以下の修飾子が付きます。

  • 変数:public static final
  • メソッド:public abstract

つまり、暗黙的に変数を定数に、メソッドを抽象メソッドにするということです。

インターフェースの実装

インターフェースを宣言したら、クラスに実装することで使用できます。
インターフェースを実装したクラスの宣言は、以下の記述で行います。

アクセス修飾子 class クラス名 implements インターフェース名 {}

implementsキーワードを使用します。
継承に似た書式ですね。
また、インターフェースは「,」で区切ることで、複数指定が可能です。
抽象クラスと同じように、インターフェースを実装したクラスで抽象メソッドを全てオーバーライドする必要があります。
この際に、「public」修飾子を指定する決まりがあります。

以下、宣言と実装の例です。

Interface.java
interface Interface {
  public static final int x = 10;
  public abstract void method();
}

InterfaceClass.java
public class InterfaceClass implements Interface {
  public void method(){};
}

また、インターフェースと抽象クラスの実装を併用することも可能です。
この場合は、抽象クラスの実装(extends)をインターフェースの実装(implements)よりも先に書く必要があります。

InterfaceClass.java
public class InterfaceClass extends AbstractSuper implements Interface {
  void abMethod(){};
  public void method(){};
}

インターフェースの継承

インターフェースはサブインターフェースに継承することもできます。
クラスの継承と同じように、継承元をスーパーインターフェース、継承先をサブインターフェースと呼びます。
書式も「extends」キーワードを使用します。

アクセス修飾子 interface サブインターフェース extends スーパーインターフェース {}

サブインターフェースを実装したクラスでは、サブインターフェースとスーパーインターフェース全てのメソッドを実装する必要があるので注意してください。

intetface A
intetface A {
  void method1();
}
intetface B
intetface B {
  void method2();
}
intetface C
intetface C extends A, B {   //AとBのインターフェースを継承
  void method3();
}
InterClass
class InterClass implements C {
  public void method1(){}  //スーパーインターフェースAのメソッド実装
  public void method2(){}  //スーパーインターフェースBのメソッド実装
  public void method3(){}  //サブインターフェースCのメソッド実装
}

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

ここまで見ると、抽象クラスとインターフェースは似ており、違いが分かりづらいと思うのでまとめておきます。

抽象クラス インターフェース
インスタンス 生成不可 生成不可
多重継承 不可(1つのみ継承) 可能(複数継承できる)
メンバ なんでも定義可能 定数と抽象メソッドのみ