#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 10. インタフェースという「クラスじゃないもの」 > 10.5 インタフェースはクラスじゃない!
 
前のページへつぎ

10.5 インタフェースはクラスじゃない!

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/04/28
動作確認環境:Windows XP Professional SP2, Java SE 5

 これまで見てきたように、インタフェースは抽象クラスに似ています。
 でも実は、インタフェースはクラスではありません
 インタフェースはクラスじゃないんです。
 インタフェースはクラスじゃないんです!

インタフェースはクラスじゃない!

 しつこいですか?
 でももう一度言います。インタフェースはクラスじゃありません!
 インタフェースはクラスとはまったくの別物なのです。
 文法的に似ていることから、インタフェースはクラスっぽいと思われるかもしれませんが、実はまったく違うものなのです。
 では、どう違うというのでしょうか。

インタフェースはクラスにくっつけるもの

 まず、インタフェースは「クラスの木」の中に含まれません。
 「クラスの木」とは何かというと、クラスの継承関係を表した図のことです。
 クラスは、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」と書かれているだけです。これは、クラスの木の構造とは関係なく、単に「このインタフェースを実装してますよ」ということが分かればいいからです。
 このように、インタフェースはクラスの木の継承関係とはまったく関係なく、クラスひとつひとつに個別にくっついているわけです。

10.5 インタフェースはクラスじゃない!
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。