JavaA2Z

KAB-studio > プログラミング > JavaA2Z > インターフェイスとは

インターフェイス

日本語 接続口
英語 interface
ふりがな いんたーふぇーす、いんたーふぇいす
フリガナ インターフェース、インターフェイス

解説

実装のないクラス
フィールドを持たず、実装のないメソッドを持つ。interfaceという予約語宣言する。
メソッド実装されていないため、インターフェイス単体では何の機能も持たない。implementsという予約語を使用して「継承」のように実装クラスを作り、インターフェイスのメソッドを「オーバーライド」するように実装する。
 
インターフェイスとその実装クラスは、スーパークラスサブクラスの関係とほぼ同じ。
ただし、インターフェイスは実装が存在しないため、インタンスを作成できない。そのため、機能的には「直接使用できないスーパークラス」となる。
スーパークラスサブクラスの関係と同じく、ポリモーフィズムが適用されるため、実装クラスインスタンス参照は、インターフェイスの参照変数に格納できる。
この「インターフェイスの参照変数」をメソッド引数として持つ場合、そのインターフェイスの実装クラスのみを渡すことができるようになる。
 
この機能を利用して、メソッドの中で「特定の処理」を呼び出す側で選択できるようにすることができる。
引数として「特定の処理」をメソッドを持つインターフェイスを持たせれば、呼び出す側はそのインターフェイスの実装クラスの内、希望の処理をう「特定の処理」が実装されている実装クラスを渡せばいい。
つまり、メソッド内の処理の一部を「どのように処理するか」呼び出す側が選択することができる。
 
これはまるで、Windowsで「エクスプローラーで外付けドライブQにファイルをコピーする」という処理が、USBコネクタに継ながれたドライブが「フロッピードライブ」か「外付けハードディスク」か「USBメモリ」かによって書き込み先が変わるのと似ている。
というより、このような機能そのものが「ポリモーフィズム」であり、インターフェイスはその機能をJavaに持たせたものだからこそ、「インターフェイス」は「インターフェイス」と呼べるのである。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // ImplementedClassクラスを使用してみます。
        ImplementedClass implementedClass = new ImplementedClass();
        implementedClass.output();
        // ImplementedClass#output()

        // 実装クラスからインターフェイスへのアップキャストは
        // 可能です。その際、ポリモーフィズムが適用されるので
        // インターフェイスから実装クラスのメソッドを呼び出す
        // ことができます。
        Interface interfaceOfimplementedClass = implementedClass;
        interfaceOfimplementedClass.output();
        // ImplementedClass#output()

        // インターフェイスには実装がないため、インスタンスを
        // 作成できません。
        // interfaceOfimplementedClass = new Interface();
        // コンパイルエラー:
        // Interface のインスタンスを生成することができません。

        // インターフェイスはクラスのように実装が存在しないため、
        // 純粋にポリモーフィズムのための存在と言えます。
        Sample sample = new Sample();
        sample.useInterface( implementedClass );
        // ImplementedClass#output()
        // このとき、もしInterfaceの実装クラスがいっぱいあったら
        // そのいっぱいある実装クラスのうちどれを渡すかで
        // useInterface()メソッドの結果が変わります。
    }

    /**
    *   Interfaceインターフェイスを受け取るメソッド。
    *   引数にInterfaceを指定することで、
    *   「Interfaceクラスのメソッドを持ち、実装しているクラス」を
    *   受け取るように指定できます。
    *   つまり、Interfaceインターフェイスが一種の「受け口」となり、
    *   この受け口と合う、つまりInterfaceインターフェイスの
    *   実装クラスのみを受け取るようになります。これが
    *   「インターフェイス」の由来です。
    */
    private void useInterface( Interface interfaces )
    {
        // 引数としてInterfaceインターフェイスの
        // 実装クラスを受け取ります。
        interfaces.output();
        // この結果は、渡される実装クラスによって異なります。
        // 解説内の「特定の処理」がこのInterface#output()メソッドです。
        // これにより、useInterface()メソッドを呼び出す側が
        // 「Interface#output()メソッドを呼び出した際の結果」を
        // 「どの実装クラスを渡すか」で選択できるわけです。
        // 逆に言うと、呼び出す側にそういった選択権を
        // 持たせたい場合に、このように引数にインターフェイスを
        // 渡してもらえばいいわけです。
    }
}

/**
*   Interfaceインターフェイスを宣言します。
*/
interface Interface
{
    /**
    *   実装用メソッドを用意します。
    */
    public void output();
    // 実装はありません。
    // もしinterfaceのメソッドに実装があると、
    // 以下のようなコンパイルエラーが
    // 発生します。
    // public void output2(){}
    // コンパイルエラー:
    // 抽象メソッドは本体を指定しません。
}

/**
*   Interfaceインターフェイスの実装クラスImplementedClassを宣言します。
*/
class ImplementedClass implements Interface
{
    /**
    *   インターフェイスのメソッドを実装します。
    *   方法はオーバーライドと同じ。
    *   同名、同引数、同戻り値のメソッドを作ってください。
    */
    public void output()
    {
        System.out.println( "ImplementedClass#output()" );
    }
    // インターフェイスを実装する場合には、すべてのメソッドを
    // 実装する必要があります。たとえば、output()メソッドを
    // 作り忘れると、以下のコンパイルエラーが発生します。
    // コンパイルエラー:
    // クラスは継承された抽象メソッド Interface.output() をインプリメントする必要があります。
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // ImplementedClassクラスを使用してみます。
        ImplementedClass implementedClass = new ImplementedClass();
        implementedClass.output();
        // ImplementedClass#output()

        // 実装クラスからインターフェイスへのアップキャストは
        // 可能です。その際、ポリモーフィズムが適用されるので
        // インターフェイスから実装クラスのメソッドを呼び出す
        // ことができます。
        Interface interfaceOfimplementedClass = implementedClass;
        interfaceOfimplementedClass.output();
        // ImplementedClass#output()

        // インターフェイスには実装がないため、インスタンスを
        // 作成できません。
        // interfaceOfimplementedClass = new Interface();
        // コンパイルエラー:
        // Interface のインスタンスを生成することができません。

        // インターフェイスはクラスのように実装が存在しないため、
        // 純粋にポリモーフィズムのための存在と言えます。
        Sample sample = new Sample();
        sample.useInterface( implementedClass );
        // ImplementedClass#output()
        // このとき、もしInterfaceの実装クラスがいっぱいあったら
        // そのいっぱいある実装クラスのうちどれを渡すかで
        // useInterface()メソッドの結果が変わります。
    }

    /**
    *   Interfaceインターフェイスを受け取るメソッド。
    *   引数にInterfaceを指定することで、
    *   「Interfaceクラスのメソッドを持ち、実装しているクラス」を
    *   受け取るように指定できます。
    *   つまり、Interfaceインターフェイスが一種の「受け口」となり、
    *   この受け口と合う、つまりInterfaceインターフェイスの
    *   実装クラスのみを受け取るようになります。これが
    *   「インターフェイス」の由来です。
    */
    private void useInterface( Interface interfaces )
    {
        // 引数としてInterfaceインターフェイスの
        // 実装クラスを受け取ります。
        interfaces.output();
        // この結果は、渡される実装クラスによって異なります。
        // 解説内の「特定の処理」がこのInterface#output()メソッドです。
        // これにより、useInterface()メソッドを呼び出す側が
        // 「Interface#output()メソッドを呼び出した際の結果」を
        // 「どの実装クラスを渡すか」で選択できるわけです。
        // 逆に言うと、呼び出す側にそういった選択権を
        // 持たせたい場合に、このように引数にインターフェイスを
        // 渡してもらえばいいわけです。
    }
}

/**
*   Interfaceインターフェイスを宣言します。
*/
interface Interface
{
    /**
    *   実装用メソッドを用意します。
    */
    public void output();
    // 実装はありません。
    // もしinterfaceのメソッドに実装があると、
    // 以下のようなコンパイルエラーが
    // 発生します。
    // public void output2(){}
    // コンパイルエラー:
    // 抽象メソッドは本体を指定しません。
}

/**
*   Interfaceインターフェイスの実装クラスImplementedClassを宣言します。
*/
class ImplementedClass implements Interface
{
    /**
    *   インターフェイスのメソッドを実装します。
    *   方法はオーバーライドと同じ。
    *   同名、同引数、同戻り値のメソッドを作ってください。
    */
    public void output()
    {
        System.out.println( "ImplementedClass#output()" );
    }
    // インターフェイスを実装する場合には、すべてのメソッドを
    // 実装する必要があります。たとえば、output()メソッドを
    // 作り忘れると、以下のコンパイルエラーが発生します。
    // コンパイルエラー:
    // クラスは継承された抽象メソッド Interface.output() をインプリメントする必要があります。
}

この単語を含むページ

「解説」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/06/15
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。