👩🏼‍🏫

【Java】インタフェース

2022/01/31に公開

はじめに

Java Silverの受験にあたって、勉強したことをまとめました。
抽象メソッド・抽象クラスについて理解してからインタフェースを学んだ方が、理解しやすいです!
↓前回書いた記事
https://zenn.dev/miya_akari/articles/dc58d4a0cb43fe

インタフェースとは

特に抽象度の高いクラスのこと(抽象クラスの王様!)

  • 抽象クラスと同じく、newを使ってインスタンス化できない
  • 使用する際は実装クラスを作成し、実装クラス側で抽象メソッドをオーバーライドする

インタフェースの条件

  1. すべてのメソッドが抽象メソッドであること
  2. 基本的にフィールドを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な具象メソッド)

  • 指定できるアクセス修飾子はpublicprivate
  • 指定していない場合は自動的に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
  • インタフェースは多重継承できる(クラスは多重継承できない!)

こんな感じかな!お疲れ様でした〜😂

参考

https://book.impress.co.jp/books/1119101083
https://www.shoeisha.co.jp/book/detail/9784798162041

Discussion