目次
はじめに
前回の記事では、Javaの抽象クラス(abstract)について紹介しました。
前回の記事
本記事では、Javaのインタフェースについて紹介します。
インタフェースとは
インタフェースとは、抽象メソッドと定数だけを定義できるものです。
抽象メソッドとは、定義だけで処理を書かないメソッド、定数とは値が決まっていて変化しないもの(final修飾子をつけると値を変更できなくなる)のことです。
次はインタフェースの例です。インタフェースはクラスではないので「class」ではなく「interface」と書きます。

インタフェースを利用するときは「implements(読み:インプリメンツ)」を使用します。implementsの右側にインタフェース名を指定することで、指定したインタフェースを使えます。

複数のインタフェースを使用する場合は、カンマ区切りで指定します。

また、インタフェースで定義した抽象メソッドは、サブクラスで必ず実装しなければいけません。サブクラスで抽象メソッドを実装しないとコンパイルエラーが発生します。

インタフェースの実装例
それでは、実際にソースコードでインタフェース(implements)の使用例を紹介します。
スポンサーリンク
次の例では、コンテンツをコントロールするインタフェース「IController」に抽象メソッドを3つ定義しています。
[インタフェース]
/**
* コンテンツをコントロールするインタフェース
*/
public interface IController {
/**
* 一時停止
*/
void pause();
/**
* 再生
*/
void play();
/**
* 停止
*/
void stop();
}
そして、インタフェースをimplementsした動画クラス「VideoController」と画像クラス「ImageController」にインタフェースで定義した抽象メソッドをオーバーライドして処理を実装しています。
[インタフェースをimplementsした動画クラス]
/**
* 動画コンテンツをコントロールするクラス
*/
public class VideoController implements IController {
/**
* 一時停止
*/
@Override
public void pause() {
System.out.println("動画の再生を一時停止する");
}
/**
* 再生
*/
@Override
public void play() {
System.out.println("動画を再生する");
}
/**
* 停止
*/
@Override
public void stop() {
System.out.println("動画の再生を停止する");
}
}
[インタフェースをimplementsした画像クラス]
/**
* 画像コンテンツをコントロールするクラス
*/
public class ImageController implements IController {
/**
* 一時停止
*/
@Override
public void pause() {
// 処理なし
}
/**
* 再生
*/
@Override
public void play() {
System.out.println("画像を再生する");
}
/**
* 停止
*/
@Override
public void stop() {
System.out.println("画像の再生を停止する");
}
}

インタフェースと抽象クラスって何が違うのですか?

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

インタフェースの役割
インタフェースとは、ものごとの境界となる部分(接点)を表す言葉です。

このインタフェースの意味のとおり、インタフェースには外部からクラスを呼び出すときの接点となるメソッド(抽象メソッド)を定義します。
そのためアクセス修飾子はpublicのみとなっており、外部から使われることを前提としています。
また、インタフェースは多重継承できます。
抽象クラスの役割
抽象クラスは継承関係にあり、スーパークラス(親クラス)の機能をサブクラス(子クラス)で再利用(引き継ぐ)したいときに使用します。
そのため抽象クラスには、抽象メソッド以外にも通常クラスと同じメンバ(フィールドとメソッド)を作成できます。
そして、アクセス修飾子にはpublicとprotectedが指定できます。protectedを指定することで、同じパッケージ内か継承関係で利用でき、外部から使われることを前提しているインタフェースとは違い、どちらかといえば内部向けの機能です。
また、抽象クラスは多重継承できません。
インタフェースと抽象クラスの違いまとめ
インタフェースと抽象クラスの違いは以下のとおりです。
抽象クラス | インタフェース | |
メンバ(フィールド、メソッド) | 何でも作れる | 定数と抽象メソッドのみ(java8からはdefaultとstaticメソッドも作れる) |
継承 | 多重継承不可 | 多重継承可 |
アクセス修飾子 | public,protected | publicのみ |
スポンサーリンク
インタフェース その他の機能
インタフェースの継承
インタフェースはクラスのように継承できます。インフェースの継承はクラスと同じで「extends」を使用します。

また、インタフェースは抽象クラスとは違い、複数継承できます。複数継承する場合はカンマ区切りで指定します。

デフォルトメソッド
Java8からインタフェースには、デフォルトメソッドとstaticメソッドが定義できます。
デフォルトメソッドはメソッドに「default」を付与します。そして、デフォルトメソッドとstaticメソッドには、処理内容を記述できます。


以下はデフォルトメソッドとstaticメソッドの例です。
[インタフェースの例]
public interface ISample {
/**
* デフォルトメソッド
*/
public default void defaultPrint() {
System.out.println("デフォルトメソッドの処理");
}
/**
* staticメソッド
*/
public static void staticPrint() {
System.out.println("staticメソッドの処理");
}
/**
* 抽象メソッド
*/
void start();
}
そして、「SampleA」クラスがインタフェース「ISample」をimplementsしています。
インタフェースをimplementsしたクラスにデフォルトメソッドとstaticメソッドをオーバーライドする必要はありません。抽象クラスのみオーバーライドして実装します。
[インタフェースをimplementsしたクラス]
public class SampleA implements ISample{
/**
* 開始処理
*/
@Override
public void start() {
System.out.println("startメソッドの処理");
}
}
最後に「SampleMain」クラスでインタフェースのデフォルトメソッドとstaticメソッド、オーバーライドした「start」メソッドを実行しています。
[プログラムの実行]
public class SampleMain {
public static void main(String[] args) {
SampleA sample = new SampleA();
sample.start();
sample.defaultPrint();
ISample.staticPrint();
}
}
[実行結果]
startメソッドの処理
デフォルトメソッドの処理
staticメソッドの処理
終わりに
本記事では、Javaのインタフェースについて紹介しました。
次回の記事では、Javaのstatic変数とstaticメソッドについて紹介します。