いくつかのワードがでてきます。下記記事をおさらいをしつつ、この記事は読んでもらえると理解が深まると思います。
インターフェース(Interface)とは?
インターフェースは、「こういう動きをする機能を提供してくださいね」というルールを定義するものです。
具体的に言うと、公開すべき操作をまとめたクラスの仕様、取り決めのこと。インターフェースは、ルールを定めるだけで実装はしません。implementsで具体的なクラスにそのルールを実装させます。
インターフェースはJavaの重要な構造で、オブジェクト指向プログラミングにおいて「どんな機能を持つべきか」という契約を定義するために使われます。実際の動作を定義するのはそのインターフェースを実装するクラスの役目です。
- インターフェースは実装を持たない:具体的な動作は書かれていません。やることだけが決められている「設計図」みたいなもの。
- 複数のインターフェースを実装できる:クラスは何個でもインターフェースを「実装」できます(多重継承)。
- メソッドは空っぽ:中身がなく、「これを実装してね」という宣言だけです。
インターフェース(Interface)の特徴
まずざっくりした特徴をまとめます。
1.メソッドの定義(宣言)
- 抽象メソッドのみを定義することが基本で、実装は持ちません。つまり、メソッドは名前だけで、中身は空っぽです。
- インターフェースを実装するクラスは、インターフェースに書かれたすべてのメソッドを実装しなければなりません。なので大量にメソッドをインターフェースで定義した際は実装クラスで全部実装する必要があるということですね。
以下が例です。↓↓
2.多重継承が可能
- 1つのクラスが複数のインターフェースを実装することができます(多重継承)。
- これは、Javaのクラスの継承における単一継承の制約(1つのクラスは1つの親クラスしか継承できない)を補うための仕組みです。なので継承の記事で説明していたextendsを使った単一継承でできない事がinterfaceではできるという事ですね。
以下が例です↓↓
インターフェースがanimalとmovableで2つあり、それを実装クラスであるdogでオーバーライドしていますね。上の例文の通り、多重継承する際はimplementsの後に2つ以上のインターフェース名を記載し、コンマで区切ればいいみたいですね。
3.すべてのメソッドは自動的に public
- インターフェース内のメソッドは自動的に
public
と見なされます。したがって、インターフェースを実装するクラスも、必ずpublic
メソッドとして実装しなければなりません。
4.フィールドは static final
(定数)のみ
- インターフェースには定数しか定義できません。変数は
static
(クラスに属する)でfinal
(変更不可)です。
以下が例です↓↓
上記のまとめも踏まえて、具体的な特徴についてまとめます。
- interfaceキーワードを指定する。
- インターフェースではpublic staticな定数を宣言できる。定数になるため、初期化する。
- インターフェースでは抽象メソッドを宣言できる。
- インスタンス化はできないのでインターフェースがついたものを使う際は実装クラスを作成して実装クラス側で抽象メソッドをオーバーライドして使用する。
- 実装クラス(インターフェースをオーバーライド)を定義する際にはimplementキーワードを使用する。
- インターフェースをもとにサブインターフェースを作成する際場合はextendsキーワードを使う。
定数を宣言できると記載がありますがそれについても特徴があります。
interface内で変数を宣言すると暗黙的にpublic static final修飾子が付与されます。つまり、自動的にstaticな定数となります。なので宣言と同時に初期化する必要があるみたいです。(初期化しないとコンパイルエラー)
インターフェース(Interface)の構文
- [アクセス修飾子] interface インターフェース名{}
具体的な組み合わせ例はこちらです。まずはインターフェースから↓↓
そしてこれに対する実装クラスは↓↓
さすがAI。この例では動物のインターフェースを作成し、鳴き声(sound)に関する機能を提供してねと定義していますね。
それに対してimplementキーワードで実装クラスを作成し、犬と猫の実装クラスを作成。クラス内で犬の鳴き声の処理と猫の鳴き声の処理を追加し、実装していますね。
インターフェース(Interface)の必要性
1.柔軟な設計
- インターフェースを使うことで、異なるクラスが同じ操作(メソッド)を提供できるようになります。これにより、コードの設計が柔軟になり、異なるオブジェクトを同じように扱えるようになります。
2.多重継承の問題を解決
- Javaではクラスの多重継承(複数のクラスを継承すること)はできませんが、インターフェースを使うことで、1つのクラスが複数のインターフェースを実装できます。これにより、柔軟に機能を組み合わせられます。
3.疎結合の実現
- インターフェースを使うことで、クラスの実装に依存しない設計(疎結合)が可能になります。これにより、システムが拡張しやすくなり、保守性が高まります。
interfaceと抽象クラスの違い
以前紹介した抽象クラスと似ている部分があると思います。こちらもまとめてみます。
インターフェースと抽象クラスの違い
項目 | インターフェース (Interface) | 抽象クラス (Abstract Class) |
---|---|---|
メソッドの実装 | メソッドは原則として実装を持たない | 実装を持つことができる |
フィールド | 基本的には持てない | フィールドを持てる |
多重継承 | 複数のインターフェースを実装可能 | 1つのクラスしか継承できない |
使い方 | 完全に「どういう動作をするか」だけ定義する | 一部は実装済みで、一部を拡張するクラス |
どっちを使うの?
- インターフェースは「クラスに特定の機能を持たせたいとき」に使います。たとえば、「音を出す機能がある」「動く機能がある」など。
- 抽象クラスは「共通の基本的な機能を持たせつつ、一部だけ決めてもらいたいとき」に使います。たとえば、「動物は眠るけど、鳴き方はそれぞれ違う」という場合です。
まとめ
インターフェースの使用例まとめ
- インターフェースは「契約」: どんな機能を提供するかを定義する。
- 実装はクラス側で: インターフェースを実装するクラスが具体的な動作を決める。
- 多重継承が可能: 複数のインターフェースを実装して、複数の「役割」を持たせられる。
インターフェースは「このクラスはこういうことができますよ」というルールを定義するツールです。抽象クラスと違って、複数のインターフェースを1つのクラスが実装できるため、より柔軟な設計が可能です。Java 8以降では、デフォルトメソッドや静的メソッドが追加され、さらに便利に使えるようになっています。
コメント