Javaのインターフェース

## インターフェースとは
Javaはクラスと**インターフェース**を作る事が出来る。
インターフェイスとは、ある特定の機能を実現するために必要なメソッドのシグニチャ（名前や引数、戻り値の型）だけを定義したもので処理そのものは持たない。
インターフェースでは**定数**と**抽象メソッド**のみを定義する事が出来る。
定義方法の基本の形は以下で**interface**キーワードを使用する。
```:
interface インターフェイス名 {
    型 メンバ変数;　　   
    戻り値 メソッド名(引数1, 引数2, ...);
}
```
インターフェイスに定義した変数やメソッドはコンパイルされた時点ですべてpublicとして扱われ、メンバ変数は自動的にpublic　static finalが付与されるため、**定数に変換される。**
またメソッドは自動的にpublic abstractが付与されるので**抽象メソッドになる。**

```:例文
interface Englishable{
　　　　　　// ↓ public static finalが付与される
   String LANG = "英語"
　　　　　　　// ↓ public abstractが付与される
　　　　　　void displayENG();
```
基本的な書き方はクラスと変わらないがinterfaceキーワードを使っているのでコンパイルの時点でメンバ変数は定数になる（定数なので名前は全て大文字にする）。
メソッドもコンパイルの時点で抽象メソッドになる。

クラスは継承することで機能を引き継いで使う事が出来るがインターフェースも引き継ぐ事が出来る。
クラスの機能を引き継ぐ時は「継承」というがインターフェイスの機能を引き継ぐときには **「実装」** と言う。

抽象メソッドが入っているのでインターフェイスからはインスタンスを作ることができないが**インターフェイスを実装したクラスでは全てのメソッドの処理を定義出来る。**

インターフェースを実装するには**implementsキーワード**を使用する。
```:例文
// class クラス名 implements インターフェイス名
class Student implements Englishable{
  String name;
        :
  void displayEng(){
     System.out.println("Name:" + name);
  }
}
```

## インターフェースと抽象クラスの違い
抽象クラスは”クラス”なので継承できるのは一つだけ。
インターフェースでは複数実装することができる。
主に、抽象クラスは複数のクラスで使うような共通処理を記載するために利用する。
一方で、インターフェイスは外部から利用するためのメソッドを定義するような使い方をする。
![スクリーンショット 2022-11-08 21.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/40377952-5781-5ebb-91ab-37937dca70e3.png)
上の写真は継承のイメージ
サブクラスであるStudentクラスとBaseballクラスは直接の継承関係にないがEnglishableインターフェイスの処理を持たせたいとした時、継承関係にない別のクラス同士でもインターフェースを実装する書き方をすることで同じメソッドを持たせる事が出来る。
## 例文
```:実行用クラス
public class StuSample7{
  public static void main(String[] args){
    Student7 stu = new Student7("Mike");
    stu.displayEng();
    
    Baseball bb = new Baseball();
    bb.displayEng();
  }
}
```
```:インターフェース
public interface Englishable{
  String LANGUAGE = "[英語]";
  void displayEng();
}
```
```:インターフェースを実装したクラス
public class Student7 implements Englishable{
  private String name;

  public Student7(String name){
    this.name = name;
  }
  public void display(){
    System.out.println("名前：" + name);
  }
  public void displayEng(){
    System.out.println(Englishable.LANGUAGE);
    System.out.println("Name:" + name);
  }
}
```
```:インターフェースを実装したクラス
public class Baseball implements Englishable{
  public void display(){
    System.out.println("キャッチボール");
    System.out.println("シートノック");
    System.out.println("バッティング");
  }
  public void displayEng(){
    System.out.println(Englishable.LANGUAGE);
    System.out.println("catch ball");
    System.out.println("seat knock");
    System.out.println("batting practice");
  }
}
```
```:出力結果
[英語]
Name:Mike
[英語]
catch ball
seat knock
batting practice
```
Englishableインターフェースには定数LANGUAGEと抽象メソッドdisplayEngが定義されている。（interfaceキーワードがついているので自動的にfainalがついた定数、abstractがついた抽象メソッドとして扱われる）
displayEngメソッドを実装しているのがStudent7クラスとBaseballクラスになる。

Student7クラスは定義の際にimplements EnglishableとしているのでEnglishableインターフェースに含まれているdisplayEngメソッドの中身（処理）を実装しなくてはならないとなる。
displayEngメソッド内の11行目でSystem.out.println(Englishable.LANGUAGE)としているのでEnglishableインターフェースの”[英語]”という文字列が入った定数LANGUAGEが出力される。
Baseballクラスも同様の処理が実装されている。

実行用クラスではStudent７クラスのコンストラクタとdisplayEngメソッドの呼び出し、Baseballクラスのオブジェクトの生成とdisplayEngメソッドの呼び出しをしている。



## 参考記事
https://camp.trainocate.co.jp/magazine/java-interface-abstract/#:~:text=1.%20Java%E3%81%AEinterface%EF%BC%88%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9,%E3%81%A0%E3%81%91%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

https://www.youtube.com/watch?v=vaNWCFFLGLg&list=PLru8-xuz0YvwUh0FofxilaQ7Tmu_lWyTo&index=8