Javaにおけるインターフェースとは
→「定義が曖昧すぎて、特別扱いされた抽象クラス」のこと。
例:Creature(生き物)クラス
→形、生態はさまざま。
生きるために、「run(逃げる)」くらいしかできない。
*特別である理由*
・内部実装(メソッドの処理動作)を一切定義しない
→同じ階層の親メソッド同士がぶつからないため、
多重継承OK とされている。
特徴
①すべてのメソッドが、抽象メソッドであること
②フィールドは基本的に持たない
③もし、インターフェース内でフィールドを宣言すると、自動的に「public static final」が補われ、定数を宣言したことになる
④多重継承OK
⑤defaultを用いれば、抽象メソッドの実装が可能(java8〜) → 実装がぶつかる恐れがあるので、基本的にはしない
⑥インターフェースに宣言されたメソッドは、自動的に「public」かつ「abstract」になる。 →「public abstract」は省略OK
※abstract = このクラス(メソッド)は抽象クラス(メソッド)ですよ、という意味を表す
正しい継承ツリーを上に辿っていくと起こる現象
抽象メソッドが現れる
→抽象メソッドばかりになる
→抽象メソッドが減りはじめる
→抽象メソッドだけになる = インターフェース
インターフェースは、クリーニング店のメニューみたいなもの。
ユーザーには、どのようにして洗うか明示されない。
インターフェースの宣言
```
public interface インターフェース名 {
//anycode
}
```
インターフェースの実装について
・インターフェースで定義されたメソッドは、全て抽象メソッドなので、
それぞれオーバーライドする必要がある
・具体的な処理内容を実装する
※オーバーライド:親クラスのメンバを子クラスで上書きすること
インターフェースの実装
```
public class クラス名 implements インターフェース名 {
//anycode
}
```
※implements = 実装する
インターフェースの効果
・同じインターフェースをimplementsする複数の子クラスたちに、共有のメソッド群の実装を強制できる
・インターフェースが定めたメソッドを、共通で持たせることができる
インターフェースによる多重継承
```
public class クラス名 implements 親インターフェースA , 親インターフェースB {
//anycode
}
```
インターフェースの継承
親インターフェース Creature
```
public interface Creature {
public abstract void run();
}
```
上記の Creatureインターフェースを継承した、Humanインターフェース
```
public interface Human exetends Creature {
void walk();
void eat();
//さらに、親インターフェースからrun()を継承する
```
まとめ
抽象クラス
・具体的な中身を決定できない曖昧なメソッドには、「abstract」をつけて、抽象メソッドとする
・抽象メソッドを一つでも含むクラスは、「abstract」をつけて、抽象クラスにしなければいけない
・抽象クラスは、インスタンス化不可
・抽象クラスと抽象メソッドを活用した「継承の材料」として、親クラスを開発すれば、イレギュラーなインスタンス化やオーバーライドを忘れる心配がない
インターフェース
・抽象クラスのうち、基本的に抽象メソッドしか持たないものを「インターフェース」として定義OK
・インターフェースは、多重継承OK
・インターフェースを親に持つ、子クラスの定義は、「implements」を使用する