Javaには、クラスとは別の枠組みとしてインターフェイスというものが用意されています。Javaでは多重継承が認められておらず、インターフェイスはそれを補う意味合いもあります。
インターフェイスは場面によって利用法が大きく異なり、大別すると以下の 3通りに分けられます。
本章では 1つめについて解説していきます。
なお、例外の解説の中で登場した Throwableは、名前こそ ~ableですが、インターフェイスではなくクラスです。
インターフェイスには、以下の予約語が関係してきます。
また、インターフェイスを継承する場合には予約語 extendsを使用します。
抽象クラスはクラスであり、インターフェイスはクラスではないので決定的に異なるのですが、幾つか似ている点があります。以下に、似ているところと異なるところを列挙してみたいと思います。
この節では Runnableインターフェイスを利用する方法について解説していきます。
Runnableについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→Runnableインターフェイス。
Runnableインターフェイスにはメソッド runが宣言されています。Runnableインターフェイスを実装するクラスは、予約語implementsを使用して Runnableを実装し、メソッド runを実装します。その記述は、以下のような感じになります。
public class Sample implements Runnable { @Override public void run() { System.out.println("こんにちは。"); } }
インターフェイスで宣言されたメソッドをひとつでも実装できなかった場合には、クラスを抽象クラスにしなければなりません。
なお、Runnableインターフェイスは、次の章「スレッド」で非常に重要なインターフェイスです。
早速インターフェイスを利用してみることとします。
ソースコードは以下の通り。
P101/Test.java
/** * テストクラスです。 */ public class Test implements Runnable { @Override public void run() { System.out.println("実行しました。"); } /** * 「こんにちは。」と表示します。 */ public void printHello() { System.out.println("こんにちは。"); } }
P101/P101.java
/** * インターフェイスを利用します。 */ public class P101 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // Test型インスタンスを作成し、Test型変数に紐づける Test test = new Test(); test.run(); test.printHello(); // Test型インスタンスを作成し、Runnable型変数に紐づける Runnable runnable = new Test(); runnable.run(); // runnable.printHello(); // ビルドエラー } }
実行結果は以下の通り。
実行しました。 こんにちは。 実行しました。
インターフェイスの型の参照型変数が作成できることが分かります。
イメージとしては以下のような感じです。このイメージの中に本来はメソッドも記述すべきですが、省略しています。
インターフェイスはクラスではありません。したがって、インターフェイスは Objectクラスを継承していません。しかし、インターフェイス型参照変数の参照先はインスタンスには違いなく、Javaでは、すべてのインスタンスは Objectクラスを継承したクラスから作成されています。
ということで、インターフェイス型の参照型変数に対しても、Objectクラスで宣言されている toStringメソッドや equalsメソッドを呼び出すことができます。例えば、P101プロジェクトのメインメソッドに以下のような記述をしてもビルドエラーにはなりません。
System.out.println("変数 runnableの参照先インスタンスの内容は" + runnable);