ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

インターフェース

こいつは、名前の通りインターフェースとして動くクラスです。Javaの中での役割は、メソッドのまとめ役です。インターフェースを継承しているとそこに宣言してあるメソッドは必ず実装しなければいけません。つまり、そのクラスが継承しているインターフェースがわかれば、クラスの中身を詳細にみなくても、そのクラスにどんなメソッドが実装してあるかがわかります。つまり、インターフェースを通して、実装の中身を統一するというのがインターフェースの効果になります。(実装の中身はサブクラス作成者に任されます)
また、インターフェースは型としても使用できます(インターフェース型)。多態性(ポリモルフィズム)を実現するときに使用する java

  • インターフェースの決まりごと
    • メソッドは宣言のみ
    • フィールド宣言は必ず定数
    • インスタンス作成不可
    • インターフェースの多重継承可
    • interface と宣言する
//インターフェースの宣言
public interface InterFace extends InterFaceChild1,InterFaceChild2{
    public int Tax(double tax,int price);
}

public interface InterFaceChild1 {
    public int currency(double rate,int price);
}

public interface InterFaceChild2 {
    public void disp(String msg);
}

上記がインターフェースの記述内容。一つ一つにメソッドを持たせて、Interfaceインターフェースには、InterFaceChild1,InterFaceChild2を継承させている。インターフェースは多重継承が可能。

// インターフェースの実装
  final class sampleInterFace implements InterFace{
    
    @Override
    public int currency(double rate, int price) {
        int result = (int)rate * price;
        return result;
    }
    @Override
    public int Tax(double tax, int price) {
        int result = (int)tax * price;
        return result;
    }
    @Override
    public void disp(String msg) {
        System.out.println(msg);
    }
    public void name(String msg) {
        System.out.println(msg);
    }
}

インターフェースをimplementsして、クラスを作成。インターフェースに宣言されてたメソッドは、実装する必要がある為、currency,Tax,dispは中身を実装(先頭大文字じゃないとかは許してください)します。そして、クラスオリジナルのメソッドも宣言可能です(nameメソッドがそれ)。

//メインメソッド
public class sampleInterFaceMain {
    public static void main(String[] args) {
        sampleInterFace sif = new sampleInterFace();
         sif.disp(String.valueOf((sif.currency(1.25, 100) * sif.Tax(1.05, 10000))));  //クラスで実装されたものを使う
        InterFace inf = new sampleInterFace();                                        //インターフェース型として使う
        inf.disp("disp");
        // inf.name("name");  メソッドnameはsampleInterFaceで宣言されていないからコンパイルエラーとなる
    }
}

ここでは、インターフェースを実装したクラスを普通のクラスとして意識することなく使用できている。インターフェースは、型としても使用できる。infのインスタンスは、sampleInterFaceクラスでインスタンス作成されているが、型がInterFace型なので、InterFace型で宣言されていないメソッドは使うことができないので、nameメソッドを使用することができない。宣言してもコンパイルエラーとなる。インターフェース型を使うとオブジェクト指向の重要な要素である多態性(ポリモルフィズム)が、実現できる。詳細は別途起こします。