
このクラスは「いきもの(Creatures)」というモノについてまとめたクラスです。クラスの先頭部分に、abstractという(修飾子)がついています。この修飾子がついているクラスは、抽象クラスと呼ばれています。

実は、この抽象クラスは、
オブジェクトを作成することができない
という特徴があります。つまり、抽象クラスCreaturesは、new演算子を使いオブジェクトを作成することができないクラスです。

Creaturesクラスをよく見るとshow()メソッドの内容が定義されていません。
このようなメソッドにも、abstractというキーワードをつけます。これは抽象メソッドと呼びます。

抽象クラスは次のようなかたちです。

抽象クラスを利用する
抽象クラスCreaturesは、サブクラスを拡張することができます。ただし、
抽象クラスから継承した抽象メソッドの内容をサブクラスで定義してオーバーライドする
という作業をしなければなりません。
抽象クラスを使った下記のコードを見てください。



抽象クラスではオブジェクトを作成することができません。抽象クラスのメソッドは必ずサブクラスでオーバーライドされます。
結果、それぞれのオブジェクトに適したshow()メソッドが呼び出されています。
なぜなら、抽象クラスを拡張したサブクラスはどれも、抽象クラスの抽象メソッド(show()メソッド)と同じ名前のメソッドを持っているからです。
つまり、抽象クラスを使えば、そのサブクラスをまとめて簡単に扱うことができます。
instanceof演算子
instanceof演算子を使うと、
オブジェクトのクラスを調べる
ということができます。


instanceof演算子を使うと、左辺の変数がさしているオブジェクトのクラスが、右辺と同じクラスであるかどうかを調べる時に便利です。
インターフェイスのしくみを知る
javaでは、抽象クラスと同じようなしくみを、インターフェースというものを使ってあらわします。

インターフェイスは、フィールドとメソッドを持つことができます。ただし、コンストラクタは持ちません。
通常、インターフェイスのメンバには何も修飾子をつけません。しかし、フィールドにはpublic static final、メソッドにはabstractという修飾子をつけているのと同じになります。
インターフェイスはオブジェクトを作成できません。つまり、newを使いオブジェクトを作成できないのです。

ただし、インターフェイス型の変数・配列は宣言できます。
インターフェイスを実装する
インターフェイスはクラスと組み合わせて使うことになり、そのことをインターフェイスを実装するといいます。
CharacterクラスでiCreaturesインターフェイスを実装するには、下記のように記述します。

さて、このようなCharacterクラスのオブジェクトを作成するためには、
インターフェイスのメソッドをすべて定義する
という作業が必要です。



実行結果を見るとそれぞれのshow()メソッドが適切に呼び出されています。
インターフェイスも抽象クラスと同じような働きをもつことがわかります。
ただし、インターフェイスのフィールドはすべて定数で、メソッドはすべて抽象メソッドとなりますので注意してください。
これらの知識を使うと、多態性によってわかりやすいコードを記述することができます。javaでは多くのクラスやインターフェイスを組み合わせて、効率よく大規模なプログラムを作成できます。