ほぷしぃ

Java言語入門 〜C言語を学んだ君へ〜

[第10回]インタフェース

[1] インタフェースの参照

前ページでインタフェースの基本的なことは分かったと思います。
では、インタフェースによるさまざまな使い方を説明します。

インタフェースの参照とは

インタフェースはクラスと異なり、インスタンス化はできません。
しかし、インタフェースを実装したオブジェクトをインタフェースの型が参照することはできます。

サンプルプログラム

interface Inter {
    void method();
}
class L implements Inter {
    public void method() {
        System.out.println("Lのメソッド");
    }
}

public class Java10_03 {
    public static void main(String args[]) {
        Inter inter;    // インタフェースInter型を宣言
        inter = new L();    // インタフェースInterがクラスLを参照
        inter.method();
    }
}

実行結果

実行結果
クラスJava10_03で、インタフェースinterがクラスLのオブジェクトを参照しています。
インタフェースの変数はこのような書き方ができます。
用途としては、「ポリモーフィズム」が実現できます。
これについては、次の項目で説明します。

[2] インタフェースとポリモフィーズム

ここでは、インタフェースを使ったポリモーフィズムの実現方法を説明します。
前項目でインタフェースの参照について説明しました。
そもそも、この参照とはポリモーフィズムを実現するための機能です。
では、どのように実現するのか、次のソースを見てください。

サンプルプログラム

// 職業:警察
interface Police {
    void investigate();    // 捜査する
}
// 警察官
class Policeman implements Police {
    public void investigate() {
        System.out.println("人間は聞き込みをする");
    }
}
// 警察犬
class PoliceDog implements Police {
    public void investigate() {
        System.out.println("犬はにおいを辿る");
    }
}
public class Java10_04 {
    public static void main(String args[]) {
        Police police[] = new Police[2];    // 配列生成
        police[0] = new Policeman();    // 警察官生成
        police[1] = new PoliceDog();    // 警察犬生成

        for (int i = 0; i < police.length; i++) {
            police[i].investigate();    // 捜査命令!
        }
    }
}

実行結果

実行結果

ソース中に、インタフェースの参照が使われています。
実行結果より、ポリモーフィズムが確認できたと思います。
ポリモーフィズムについてはすでに第9回の継承で説明したので、特に説明することはありません。
注意点として、クラスJava10_04でインタフェースの配列を宣言しました。
これは、インタフェースをインスタンス化したのではなく、インタフェースの領域を確保したということです。
くれぐれも間違えないようにしてください。

[3] instanceof

インタフェースの参照について説明しました。
これは、インタフェース型の変数がオブジェクトを参照するというものです。
ところがこの参照をしている状態では、オブジェクト本来の型が何であったかわかりません。
そこで、使用するものが、instanceofです。これは次のように使います。

instanceofの形式

対象 instanceof 型名

「対象」には、調べたいオブジェクトを、「型名」には、対象と比較する型を入れます。
もし、「対象」が「型名」と一致した場合、「true」を返します。そうでなければ「false」を返します。
では、実際に使ってみます。次のソースを見てください。

サンプルプログラム

interface LAN {
}

class PC implements LAN {
}

class Printer implements LAN {
}

public class Java10_05 {
    public static void main(String args[]) {
        LAN lan[] = new LAN[2];
        lan[0] = new PC();
        lan[1] = new Printer();

        for (int i = 0; i < lan.length; i++) {
            if (lan[i] instanceof PC) {
                System.out.println("パソコンです");
            } else {
                System.out.println("パソコンではありません");
            }
        }
    }
}

実行結果

実行結果
instanceofによって、配列に格納したオブジェクトが、クラスPCであるか、そうでないかを判定しています。
実行結果より、正しく判定できたことが確認できます。

[4] 抽象クラスとインタフェース

これまでに「ポリモーフィズム」を実現する方法をいくつか説明しました。
そして、実現のために使用したものに「抽象クラス」と「インタフェース」がありました。
どちらを使っても実現はできます。
そのため、この2つの違いがわかりにくかったかもしれません。
ここでは、この2つの使い分けをどのようにすればよいかを簡単に説明します。
まず、2つの特徴をそれぞれ説明します。
「抽象クラス」は「抽象メソッド」を含め、通常のメソッドや、変数なども定義できます。
しかし、クラスであるために、「系統」の異なるクラスへは適用できません。
それに対し、「インタフェース」はクラスの「系統」を気にせず、どのクラスにも適応できます。
しかし、「定数」と「抽象メソッド」しか定義できません。
つまり、簡単に説明すると、系統に従えるなら、「抽象クラス」を使います。
そうでなければ、「インタフェース」を使えばよいということです。
やはり、まだわかりにくいと思います。 Javaを使ってどんどんソースを書いていくと、違いがわかってくると思います。



前のページへ ページのトップへ 第1問-問題へ