インターフェイスの前にクラスの復習
まず、Javaのインターフェイスとクラスは似ているところがありますので、クラスについて知りたい方は下記の記事をご覧ください。





Javaのインターフェイスとは
クラスは参照型の一種で、名前を持ち、フィールドとメソッドを持ち、スーパークラスやサブクラスを持っています。
インターフェイスも参照型の一種です。名前を持ち、フィールドとメソッドを持ち、スーパーインターフェイスやサブインターフェイスを持っています。
クラスとインターフェイスの異なる点は以下になります。
- インターフェイスが持つフィールドは必ず定数です
- インターフェイスが持つメソッドは抽象メソッドです(メソッドは実装されていません)
- インターフェイスはインスタンスを作ることはできません
ここで、インターフェイスの例を挙げてみます。
interface Lockable{
boolean lock();
boolean unlock();
}
クラスを作るときは、先頭にclassと書きますが、インターフェイスの時は、先頭にinterfaceと書き、その直後にインターフェイス名を記述します。つまり、Lockableというのが、このインターフェイスの名前になります。この名前はクラス名と同様にプログラムを作る人が命名することができます。
「{」から「}」までがインターフェイスの宣言の範囲になります。
上記の例ではフィールドは宣言されていません。その代わり、lockとunlockという2つのメソッドが宣言されていますが、メソッドの本体である「{ }」でくくられた部分がありませんので、抽象メソッドであることが分かります。interfaceの中に宣言されているメソッドは、abstractというキーワードが付いていなくても自動的に抽象メソッドになります。実は、interfaceの中には「{ }」でくくられたメソッドを宣言することができません。
Javaのインターフェイスの「実装」
インターフェイスの「宣言」とは別に、そのインターフェイスを「実装」するクラスを宣言することができます。先ほど、インターフェイスのメソッドは抽象メソッドであり「{ }」でくくられた部分がないと説明しました。この「{ }」でくくられた中身のないインターフェイスのメソッドの中身の部分をクラスによってメソッドの本体部分を書くことになります。
class Kinko implements Lockable{
public boolean lock(){
・・・
}
public boolean unlock(){
・・・
}
}
「実装」というのは「実際に装備する」という意味で、メソッドの本体を用意することを表しています。
インターフェイスの宣言では、lockとunlockというメソッドの本体は存在しませんでした。単に、lockとunlockというメソッドの名前だけは決まっていましたが、実際にどのように動くのかということについては、何も書かれていませんでした。
しかし、インターフェイスを「実装」しているKinkoクラスの方では、lockとunlockというメソッドの本体が書かれることになります。
Javaのextendsとimplementsの違い
Javaではextendsを使うことによって、「クラスの拡張」をすることができます。しかし、これはインターフェイスを宣言する時のimplementsと何が違うのでしょうか。
Javaではextendsを使ってスーパークラスからサブクラスを作成することができます。そしてそのサブクラスをスーパークラスとしてサブクラスを作ることもできます。つまり、フォルダの中にフォルダを作るように、ちょうどツリー構造になっていることはご存知かと思います。ツリー構造の末端からスーパークラスをたどっていくと、それらのクラスの起源となるスーパークラスに行き当たることになります。しかし、起源となるスーパークラスが異なれば、その配下にあるサブクラスは異なる継承関係にあると理解することができると思います。
ここで、インターフェイスの話に戻りますが、インターフェイスはクラス階層の上では無関係なクラスであっても、inplementsを使って宣言することによって、共通の抽象メソッドを持っているとプログラム上で述べることができるのです。クラス階層の上でバラバラなクラスには、継承関係はありませんので、メソッドの関連もあまりありません。しかし、implementsで同じインターフェイスをクラスで実装することによって、「共通のメソッドを持っている」ということをプログラムで記述することができます。