Javaを使うために改訂2版 パーフェクトJavaopen in new windowを読んだメモ

クラスとインターフェースの違い

  • インターフェースは雛形としての役割を持たない
  • インターフェースは実体化できず、型定義に特化している
  • インターフェースの継承の目的は多様性のみ(クラスの拡張継承には実装コードの共有という側面もある)

インターフェース宣言

[修飾子] interface インターフェース名 {
    メンバ宣言
}
1
2
3

インターフェースの修飾子

modifierdescription
publicグローバルにアクセス可(書かないとパッケージ内に限定)
abstractインターフェースは暗黙的に abstract なので書かなくても同じ
strictfpインターフェース内に記述した浮動小数点演算を厳密に評価
アノテーション省略

インターフェースのメンバ

  • 抽象メソッド(実装なし)
  • default メソッド
  • static メソッド
  • 定数フィールド
  • static なネストしたクラス
  • static なネストしたインターフェース

メソッド宣言

modifierdescription
public暗黙的に public なので書かなくても同じ
defaultデフォルトメソッド
staticstatic メソッド
abstract暗黙的に abstract なので書かなくても同じ
  • default メソッドはインスタンスメソッド
  • インターフェースを継承した具象クラスのインスタンスメソッドになる
  • フィールド変数は暗黙的に public static final

インターフェースと実装クラス

インターフェース継承

[修飾子] class クラス名 implements インターフェース名 {
    クラス本体
}
1
2
3

複数のインターフェースを同時に継承することができる

[修飾子] class クラス名 implements インターフェース名, インターフェース名 {
    クラス本体
}
1
2
3
  • クラスの拡張継承とインターフェースの継承を同時にできる
  • このとき implementsextends より後に書く
[修飾子] class クラス名 extends 親クラス名 implements インターフェース名 {
    クラス本体
}
1
2
3
  • インターフェースを継承したクラスはインターフェースの抽象メソッドをすべてオーバーライドする必要がある
  • インターフェースから継承したメソッドのアクセス制御は public 修飾子がないとコンパイルエラー
  • メソッドのオーバーライドはクラスの拡張継承と同様に行う

ネストしたインターフェース

  • クラス内のネストしたインターフェース
    • public protected 無指定 private のいずれかを指定する
  • インターフェース内のネストしたインターフェース
    • 常に public
  • インターフェース内のネストしたクラス
    • 常に public かつ static
  • ネストして宣言されたインターフェースは常に static

インターフェース自体の拡張継承

  • インターフェースも拡張継承できる
  • インターフェースは複数の親インターフェースを指定可能
interface Parent {
    void print();
}

interface Child extends Parent {
    // void print() を継承
}

interface Father {
    void print();
}

interface Mother {
    void exec();
}

interface Child2 extends Father, Mother {
    // void print(), void exec() を継承
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

参照

改訂2版 パーフェクトJavaopen in new window

Last Updated:
Contributors: sojiro14