🚀
Java Silver 勉強⑦インタフェースによる抽象化
【出題項目の例】
Javaの基本データ型と文字列の操作
演算子と制御構造
配列の操作
クラスの宣言とインスタンスの使用
メソッドの作成と使用
カプセル化の適用
継承による実装の再利用
インタフェースによる抽象化
例外処理
モジュール・システム
インタフェースによる抽象化
1. インタフェースとは?
インタフェースは、クラスが実装しなければならないメソッドの「設計図」を定義するものです。インタフェース自体は実装を持たず、メソッドのシグネチャ(引数、戻り値など)のみを定義します。クラスは、このインタフェースを実装することで、実際の処理を定義します。
-
インタフェースの特徴:
- メソッドの実装は持たず、メソッドの宣言のみを行います。
- 複数のインタフェースを実装することが可能です(多重実装)。
- クラスは、インタフェースに定義されたすべてのメソッドを実装しなければならない。
2. インタフェースと抽象クラスの違い
インタフェースと抽象クラスの違いは以下の通りです:
特徴 | インタフェース | 抽象クラス |
---|---|---|
メソッドの実装 | なし (ただし、Java 8以降はdefaultメソッドで実装可能) | なし(または部分的にあり) |
多重継承 | 可能 | 不可能 |
フィールド(変数) | 定義できない(public static final のみ) |
定義可能(インスタンス変数も可) |
クラスの継承 | クラスは複数のインタフェースを実装できる | クラスは1つの抽象クラスしか継承できない |
3. インタフェースの定義
インタフェースは interface
キーワードを使って定義します。メソッドには実装がなく、シグネチャのみが含まれます。
インタフェースの例
// Animalというインタフェースを定義
interface Animal {
// 抽象メソッドの宣言(実装は無し)
void sound(); // 音を出す
void sleep(); // 眠る
}
4. インタフェースの実装
インタフェースを実装するためには、implements
キーワードを使います。インタフェースに定義されたメソッドは、実装するクラスで必ず実装しなければなりません。
インタフェースの実装例
// Animalインタフェースを実装するクラス
class Dog implements Animal {
// soundメソッドを実装
public void sound() {
System.out.println("ワンワン!");
}
// sleepメソッドを実装
public void sleep() {
System.out.println("犬は寝る");
}
}
5. インタフェースの使用例
インタフェースは、異なるクラスが共通のメソッドを持つことを保証するために使われます。例えば、異なる動物クラスがそれぞれの方法で sound()
を実装する場合、インタフェースを使うことで、どのクラスも sound()
メソッドを持つことが保証されます。
使用例
public class Main {
public static void main(String[] args) {
Animal dog = new Dog(); // Dogクラスをインタフェース型で参照
dog.sound(); // ワンワン!
dog.sleep(); // 犬は寝る
}
}
6. インタフェースのメリット
- 多重継承の代替: クラスは1つの抽象クラスしか継承できませんが、インタフェースは複数実装できるため、より柔軟な設計が可能です。
- 共通のインタフェースを提供: 異なるクラス間で共通のメソッドを強制できるため、統一された処理を行いたい場合に便利です。
- 疎結合の設計: インタフェースを利用することで、実装クラスに依存しないコードが書けます。これにより、コードの変更が容易になります。
7. インタフェースの重要ポイント
- インタフェースはメソッドのシグネチャのみ定義し、実際の処理は実装するクラスに任せる。
- クラスはインタフェースを実装することによって、そのインタフェースに定義されたメソッドを必ず実装しなければならない。
- インタフェースは多重継承をサポートしているため、複数のインタフェースを同時に実装できます。
8. 追加機能
Java8から、インタフェースで実装を含むメソッドを定義できるようになりました。
(従来は抽象メソッドのみ宣言可能だった!)
✅ default
メソッド()
-
default
キーワードを使って、インターフェース内で具象メソッド(実装を含むメソッド)を定義できる - 自動的に
public
が付与される - ただし、
equals()
,hashCode()
,toString()
のようなObject
クラスのメソッドは定義できない
✅ static
メソッド
-
static
キーワードを使って、インターフェース名を使って直接呼び出せる静的メソッドを定義できる - デフォルトで
public
が付与されるが、private
にすることも可能 - 実装クラスでオーバーライドできない
✅ 使用方法
-
default
メソッドは 実装クラスのインスタンスを使って呼び出す -
static
メソッドは インターフェース名を使って直接呼び出す
ポイント
default
メソッドはインターフェースを実装したクラスで使用可能で、オーバーライドもできる。static
メソッドはインターフェース名を使って直接呼び出す必要があり、オーバーライドできない。default
メソッドではequals()
,hashCode()
,toString()
を定義できない。static
メソッドはprivate
にすることができるが、デフォルトではpublic
が付与される。
Discussion