第二十一章 
 〜クラス編〜
 インターフェース
 インターフェースをやる前に1つJavaの特徴として言っておきたいことがあるです。
それは、Javaでは、継承できるクラスは1つだけと言うことです。
具体的には、次のように書くことはできないと言うことです。
class A extends B, C{}
クラスAにクラスB、Cを継承するようなことはできないと言うことです。ちなみにこの
継承の仕方を多重継承と呼んでいるです。
Javaにはこれに代わる機能があるです。それがインターフェースです。

 まずは、インターフェースがどういう物か説明するです。インターフェースはクラス
に機能を追加するようなときに使うです。継承のときと似ているですね!そして継承と
一緒に組み合わせて使うことができるです。

 インターフェースの特徴は、抽象クラスに良く似ているです。まず抽象メソッドが存
在するです。でも抽象クラスと違うのは抽象メソッド以外のメソッドは書けないです。
そしてもう1つは、変数も存在しないです。定数だったら書くことができると言うこと
です。ただし抽象メソッドで言うabstract、定数で言うfinalは省略して書くこともでき
るです。その場合強制的に抽象メソッド、定数になるです。省くと言っても次のように
書くです。
int a = 10; //かならず初期化する。
void b();  //;を終わりに書く
さらにインターフェースでは、privateprotectedは宣言できないです。
抽象クラスと同じでオブジェクトを作成できないです。

インターフェースの書き方
 interface インターフェース名{
   定数1;
    :
   抽象メソッド1();
    :
 }

インターフェースの利用の仕方
 class A implements インターフェース名{}
 class A extends B implements インターフェース名{}
 class A extends B implements インターフェース名1, インターフェース名2,・・・{}
 インターフェースは、複数書くことができるです。

 それでは実際に今回のサンプルプログラムに移りたいと思うです。今回の例はパソコ
ンがあったとして、そのパソコンでテレビが見たいのでテレビチューナを取り付けるこ
とにするです。そうるすと、パソコンクラスにテレビチューナインターフェースを取り
付けることになるですね!それを例にサンプルプログラムを作るです。
Rei21_1
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
class Rei21_1{
    public static void main(String[] args){
        PersonalComputer pc =
            new PersonalComputer(2.4, 100, 512, "DVD-RW"); 

        pc.getStatus();
        pc.look();
        pc.record();
    }
}

interface TelevisionTuner{
    public abstract void look();
    public abstract void record();
}

class PersonalComputer implements TelevisionTuner{
    private double cpu;      //単位はGHz
    private int hdd;         //単位はGB
    private int memory;      //単位はMB
    private String drive;    //CD-ROMドライブなどで使うドライブ

    public PersonalComputer(double c, int h, int m, String d){
        cpu = c;
        hdd = h;
        memory = m;
        drive = d;
    }

    public void getStatus(){
        System.out.println("CPU:    " + cpu    + "GHz");
        System.out.println("HDD:    " + hdd    + "GB");
        System.out.println("Memory: " + memory + "MB");
        System.out.println("Drive:  " + drive);
        System.out.println("テレビを見たり録画ができるです");
    }

    public void look(){
        System.out.println("パソコンでテレビを見るです");
    }

    public void record(){
        System.out.println("パソコンでテレビを録画するです");
    }
}

 インターフェースで宣言した2つのメソッドがPersonalComputerクラスでそれぞれ
利用されているですね。このインターフェースをimplementsによって利用することを
インターフェースを実装すると言うです。インターフェースを実装した場合、かなら
ずインターフェースで宣言したメソッドを再定義(オーバーライド)しないといけな
いです。本当にそうなのかは、PersonalComputerクラスのlook()メソッドとrecord()
メソッドを消してみて再びコンパイルをしてみてほしいです。そうするとエラーが出
てくるはずです。実は抽象クラスでも言えたことなので覚えてほしいです。
一言で言ってしまうですと、抽象メソッドがある場合は、オーバーライドしないとい
けないと言うことです。


今回のポイント
@ 複数のクラスを継承することを多重継承と言う
A Javaは多重継承できない
B 多重継承に代わるインターフェースと言う機能がある
C インターフェースを書くときは、classではなくinterfaceを書く
D インターフェースを利用するときはextendsではなくimplementsを書く
E Dの利用の仕方をインターフェースの実装と言うですね!
F 抽象メソッドがある抽象クラス、インターフェースを利用する場合、
  その抽象メソッドをオーバーライドしないといけない。
G インターフェースの特徴
  ・変数を宣言できない
  ・普通のメソッドを宣言できない
  ・定数を宣言することはできる
  ・抽象メソッドを宣言できる
  ・finalやabstractを省略した場合、それぞれ定数、抽象メソッドになる
   但し、変数の場合は初期化、メソッドの場合は最後に;をつけること
  ・アクセス修飾子にprivate、protectedを宣言できない

TOPに戻る   Java講座に戻る