これまで見てきたように、インタフェースは抽象クラスに似ています。
でも実は、インタフェースはクラスではありません。
インタフェースはクラスじゃないんです。
インタフェースはクラスじゃないんです!
インタフェースはクラスじゃない!
しつこいですか?
でももう一度言います。インタフェースはクラスじゃありません!
インタフェースはクラスとはまったくの別物なのです。
文法的に似ていることから、インタフェースはクラスっぽいと思われるかもしれませんが、実はまったく違うものなのです。
では、どう違うというのでしょうか。
インタフェースはクラスにくっつけるもの
まず、インタフェースは「クラスの木」の中に含まれません。
「クラスの木」とは何かというと、クラスの継承関係を表した図のことです。
クラスは、Objectクラスを「一番上のスーパークラス」として、まるで木のようにサブクラスを作っていきます。
まず、一番上にObjectクラスがあります。「8.2 Objectクラスってなに?」で説明したように、すべてのクラスはこのクラスのサブクラスになります。
そのObjectクラスから、枝葉のようにサブクラスが作られます。
StringクラスやHashMapクラスのようなJava APIのクラスはもちろん、自分で新しく作ったクラスも必ずこの木の一部となります。クラスはすべてこの木の中に含まれるわけです。
ところが、インタフェースはこの木に含まれません。
インタフェースはクラスではないので、Objectクラスのサブクラスにはなりません。そのためクラスの木の中にも含まれません。
でも、クラスの木に関わりはします。
どう関わるかというと、クラスにくっつきます。
インタフェースはそれぞれのクラスにくっつきます。
木の構造とは関係なく、クラスは個別にインタフェースを実装します。つまり、継承と同時にインタフェースをくっつけるわけです。
たとえばStringクラスはCharSequence、Comparable、Serializableという3つのインタフェースがくっついています。
また、HashMapクラスはCloneable、Map、Serializableという3つのインタフェースがくっついています。
実際、APIリファレンスを見てみると、クラスは「木」としてスーパークラス・サブクラスの関係が分かるよう書かれているのに、インタフェースは単に「実装した」とだけしか書かれていません。
HashMapクラスは「Objectクラス→AbstractMapクラス→HashMapクラス」と、木の上から下へ順に書かれています。
ところがインタフェースは「すべての実装インタフェース:Cloneable, Map, Serializable」と書かれているだけです。これは、クラスの木の構造とは関係なく、単に「このインタフェースを実装してますよ」ということが分かればいいからです。
このように、インタフェースはクラスの木の継承関係とはまったく関係なく、クラスひとつひとつに個別にくっついているわけです。