インターフェースとは

広告

インターフェースはメソッド名や引数、戻り値だけを記述し、処理内容を記述しないメソッドを定義したものです。インターフェースを実装したクラスは、インターフェースで定義されているメソッドを実装する必要があります。抽象クラスと似ていますが、クラスがある機能を実現するために必要となるメソッドをまとめたものがインターフェースです。ここではオブジェクト指向におけるインターフェースの役割について解説します。

インターフェースとは

インターフェースは抽象クラスと似た仕組みです。抽象クラスが他のクラスに継承されることを前提としているように、インターフェースは他のクラスに実装してもらうものとなります。インターフェースには抽象クラスの抽象メソッドと同じように、メソッドの名前や引数、戻り値だけを定義し、処理内容を記述しないメソッドを定義します。

インターフェースは class の代わりに interface キーワードを使用して定義します。

interface インターフェース名 {
}

インターフェースはクラスではないため、インターフェース自体のオブジェクトを作成することはできません。

フィールドは定義できますが、必ず初期化を行う必要があります。またインターフェースで定義されたフィールドは定数として扱われるため、あとから値を変更することはできません。

抽象クラスは同じ系列のクラスの共通部分を定義するために使用されるイメージですが、インターフェースはクラスで実装すべき機能をグループごとにまとめたものです。例えば購入する際に年齢確認が必要となる商品を扱うクラスに対して、年齢確認を行うメソッドを定義したインターフェースを作成し、各クラスで実装するといったイメージです。

インターフェースで定義するメソッド

インターフェースでは処理内容を持たないメソッドを定義します。このようなメソッドは自動的に public abstract として扱われます。

interface Basic {
  void dispClassname();
}

上記のメソッドは次のように記述した場合と同じ意味になります。

interface Basic {
  public abstract void dispClassname();
}

そのため、通常は public abstract を省略して記述します。

なおインターフェースにはコンストラクタというものはありません。また抽象クラスと異なり、基本的には処理内容を持たないメソッドを定義します。(Java8 以降では、インターフェースでも処理内容を記述したメソッドを定義できるようになりました。詳しくは「defaultメソッド」を参照されてください)。

インターフェースで定義するフィールド

インターフェースではフィールドを定義することができます。ただ必ず初期化を一緒に行う必要があります。またフィールドは自動的に public static final として扱われます。

interface Basic {
  String NAME = "Product Interface";
}

上記のフィールドは次のように記述した場合と同じ意味になります。

interface Basic {
  public static final String NAME = "Product Interface";
}

そのため、通常は public static final を省略して記述します。final が付与されているのでフィールドの値は変更することができません。

インターフェースの実装

インターフェースをクラスで利用する場合は、継承するとは言わず実装するといいます。実装する場合は次のように implements キーワードを使用します。

class クラス名 implements インターフェース名 {
}

インターフェースを実装したクラスでは、インターフェースで定義されているメソッドを必ず実装する必要があります。

interface Basic {
  void dispClassname();
}

class Foods implements Basic {
  public void dispClassname() {
    System.out.println("Foods Class");
  }
}

class Gadgets implements Basic {
  public void dispClassname() {
    System.out.println("Gadgets Class");
  }
}

インターフェースで定義されたフィールドは自動的に public static final として扱われます。そのためインターフェースを実装したクラス内ではフィールド名でアクセスすることができます。またクラス外からは「インターフェース名.フィールド名」のようにアクセスすることができます。

interface Basic {
  String NAME = "Basic Interface";
  void dispClassname();
}

class Foods implements Basic {
  public void dispClassname() {
    System.out.println(NAME);
    System.out.println("Foods Class");
  }
}

インターフェースの多重実装

クラスは複数のクラスを同時に継承することはできませんが、複数のインターフェースを同時に実装することができます。複数のインターフェースを実装することをインターフェースの多重実装と呼びます。複数のインターフェースを同じクラスで実装する場合はカンマ(,)で区切ってインターフェースを記述してください。

class クラス名 implements インターフェース1, インターフェース2, ... {
}

例えば年齢確認に関連したメソッドを定義したインターフェースや、ポイントの付与に関係するメソッドを定義したインターフェースなど、何かを実現するために必要となるメソッドをまとめたインターフェースを必要なだけ用意し、クラスごとに必要なインターフェースを組み合わせて実装することができます。

またインターフェースを実装すると、そのクラスのオブジェクトはインターフェース型の変数に代入することができます。複数のインターフェースを実装したクラスのオブジェクトの場合、必要に応じてどちらのインターフェース型の変数に代入して使用することができます。

public class Sample {
  public static void main(String[] args) {
    Watch w = new Smartwatch();
    Health h = new Smartwatch();
  }
}

interface Watch{
}

interface Health{
}

class Smartwatch implements Watch, Health {
}

このように1つのクラスのオブジェクトを複数のインターフェース型として扱うことができます。

-- --

オブジェクト指向におけるインターフェースの役割について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。