目次
はじめに
前回の記事では、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メソッドについて紹介します。