👩🏼🏫
【Java】インタフェース
はじめに
Java Silverの受験にあたって、勉強したことをまとめました。
抽象メソッド・抽象クラスについて理解してからインタフェースを学んだ方が、理解しやすいです!
↓前回書いた記事
インタフェースとは
特に抽象度の高いクラスのこと(抽象クラスの王様!)
- 抽象クラスと同じく、newを使ってインスタンス化できない
- 使用する際は実装クラスを作成し、実装クラス側で抽象メソッドをオーバーライドする
インタフェースの条件
- すべてのメソッドが抽象メソッドであること
- 基本的にフィールドを1つも持たない
フィールドとは
クラスブロック内に宣言された変数のこと。
キャラクターの属性(name・hpなど)と覚えておくと分かりやすいです。
インタフェースの構文
public interface インタフェース名 {
// 抽象メソッド
}
Character.java
public interface Character {
public abstract void run(); // 抽象メソッド
}
インタフェースとして宣言したメソッドは、自動的に抽象メソッドになる
ので、通常は↓のように記述することが多いらしい。
Character.java
public interface Character {
void run(); // 抽象メソッド(自動的にpublic abstractが追加される)
}
インタフェースのメソッドについて
インタフェースの条件に「すべてのメソッドが抽象メソッドであること」とあるけど、
SE8から抽象メソッドに加えてデフォルトメソッドとstaticメソッドを記述できるようになった。
デフォルトメソッド
…処理を記述したメソッド(具象メソッド)
- 戻り値の前に
default
をつける - 指定できるアクセス修飾子はpublicのみ!
- 指定していない場合は自動的にpublic修飾子が付与される
アクセス修飾子 default 戻り値 メソッド名(引数) {
// 処理
}
staticメソッド
…処理を記述したstaticメソッド(staticな具象メソッド)
- 指定できるアクセス修飾子はpublicとprivate
- 指定していない場合は自動的にpublic修飾子が付与される
- protectedは使用できない! 指定した場合はコンパイルエラーになる
アクセス修飾子 static 戻り値 メソッド名(引数) {
// 処理
}
インタフェースでの定数宣言
インタフェースは基本的にはフィールドを持たないが、public static final
が付いた定数であれば宣言できる
-
public static final
を省略しても、自動的に追加される
(インタフェース内に宣言した変数は、自動的にstatic定数になる) -
定数宣言時は必ず初期化しておくこと!!
初期化していない場合は定数にできず、コンパイルエラーになる
public interface Sample {
int a = 10;
// public static final int a = 10; になる
int b;
// 初期化していないのでコンパイルエラー
}
インタフェースの実装と継承
インタフェースの実装
継承元がインタフェースで、継承先がクラスの場合
→ extends
ではなく、implements
を使う(実装)
public class クラス名 implements 親インタフェース名 {
// 抽象クラスをオーバーライドする
}
インタフェースの継承
継承元がインタフェースで、継承先もインタフェースの場合
→ extends
を使う(継承)
public interface インタフェース名 extends 親インタフェース名 {
// 抽象メソッドを追加する
}
implementsとextendsの使い分け
継承元 | 継承先 | 使用キーワード |
---|---|---|
クラス | クラス | extends |
インタフェース | クラス | implements |
インタフェース | インタフェース | extends |
継承と実装を同時に行うこともできる
public class クラス名 extends 親クラス implements インタフェース名 {
// 親クラスからフィールドを継承
// 親クラスから継承した抽象メソッドを実装
}
インタフェースは多重継承できる
public class クラス名 implements 親インタフェース名1, 親インタフェース名2 {
// 複数のインタフェースを実装
}
まとめ
むずかしい〜!!けどとりあえず、
- インタフェースは抽象クラスの王様
- 構文は
public interface インタフェース名{}
- インタフェースを実装するときは
implements
、継承するときはextends
- インタフェースは多重継承できる(クラスは多重継承できない!)
こんな感じかな!お疲れ様でした〜😂
参考
Discussion