' P '

whatever I will forget

Java Interface

Interfaceの定義。

ルール

  • Interfaceという名前でclassみたいなノリで作成する
  • Interfaceを作ったら頭の文字をIにするのが慣習 (IFooなど)
  • interfaceを使う側のclassでimplements Interface nameを記述する
  • interfaceをimplementsしたclassでは、interfaceのmethod全てをoverrideしないといけない
  • Main側ではInterfaceのobjを宣言することはできるが、新しくinterfaceのobjを作成(new)はできない。(interfaceはabstractで、実体が無いため)
  • Main側でInterfaceを複数classで使用する場合は大人しくInterface型でobjを宣言しましょう

Tips

  • ArrayList<String> array = new ArrayList<String>とか書いてたけど、List<String> array = new ArrayList<~>()ってできるらしい。なんでかっていうと、Listはinterfaceで、ArrayListにimplementsされているから。
  • InheritanceInterface、どっちを使うか迷った時。まずはclass同士の関係性を考えよう。例えばAnimalクラスなら犬も鳥も歩ける(Walkメソッドとか)ので、そういう部分だけ共通としてInterfaceにするとか、ってのが考えられる。まあこれは設計次第というか、クラスの関係性次第ですね...
  • ISample obj = new Test(num)としてもコンパイルは通るが、Testクラスに固有するメソッドは使用できない。例えば下記コード例のobj.getPeron()コンパイルエラーになる。Interface型でobjを生成した場合は、((Test)obj).getPeronとTest型にキャストしてあげれば、Test固有のメソッドも使用できるようになる。

Interface

public interface ISample {
    void sampleMethodA();
    void sampleMethodB();
    int sampleMethodC(int something);
    String sampleMethodD(String something);
    boolean sampleMethodE(boolean something);
}

Class

public class Test implements ISample{
    private boolean peron;
    private int num;
    private String something;

    Test(int num) {
        this.num = num;
    }

    public boolean getPeron() {
        return this.peron;
    }

    @Override
    public void sampleMethodA() {
        System.out.println("aaaaaa");
    }

    @Override
    public void sampleMethodB() {
        System.out.println("aaaaaa");
    }

    @Override
    public int sampleMethodC(int a) {
        System.out.println(a);
    }

    @Override
    public String sampleMethodD(String a) {
        System.out.println(a);
    }

    @Override
    public boolean sampleMethodE(boolean a) {
        System.out.println(a);
    }
}

Main

public class Interfaces {
    public static void main(String[] args) {
        ISample obj;
        obj = new Test(30);
        obj.sampleMethodA();
    }
}