Java言語入門 〜C言語を学んだ君へ〜
[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を使ってどんどんソースを書いていくと、違いがわかってくると思います。