
継承のしくみを知る
これまでは、「キャラクタ」の機能をまとめたクラスを使って、プログラムを作成してきました。この章では、さらに、新しいプログラムを作成していくことにしましょう。
5種類の格闘ゲーム
を扱うプログラムを作成することを考えてみてください。野獣キャラクタは初期キャラクタの一種ですから、多くの共通点があります。
javaでは、すでに作成したクラスをもとにして、新しいクラスを作成することができるようになっています。このように、新しいクラスを作成することを、
クラスを拡張する(extends)
といいます。
新しいクラス(野獣キャラクタ)は、概存のクラス(初期キャラクタ)のメンバを「受け継ぐ」しくみになっています。このため、初期キャラクタにあるメンバをコード中にもう一度書く必要はありません。野獣キャラクタ独自の機能だけを書けばよいのです。
このように、新しく拡張したクラスが概存のクラスのメンバを受け継ぐことを、継承と呼びます。この時、もとになる概存のクラスはスーパークラス、新しいクラスはサブクラスと呼ばれます。
クラスを拡張する
サブクラスの宣言をするには、extendsというキーワードに続けて、スーパークラスの名前を指定します。

BeastCharaクラスはCharacterクラスのメンバを継承します。このため、BeastCharaクラス内では、Characterクラスにない、独自のメンバだけ書けばよいのです。
これが、stageフィールドとsetStage()メソッドとなっています。

setChara()メソッド①はスーパークラスで定義されているメソッドです。また、サブクラスで新しく追加したsetStage()メソッド②も同じように呼び出すことができます。
このように、クラスを拡張することで、すでに設計したクラスから効率よく新しいクラスを作成することができます。
スーパークラスのコンストラクタを呼び出す
Sample11_01_1の実行結果をよく見てください。最初に「キャラクターが誕生しました。」と出力されていることから、スーパークラスのコンストラクタの処理が先に行われていることがわかります。
このように特に何も指定しない場合、
サブクラスのコンストラクタ内の先頭で、スーパークラスの引数のないコンストラクタを呼び出す
ということになっています。
スーパークラスのコンストラクタは、サブクラスに継承されません。そのかわり、スーパークラスの引数なしのコンストラクタが、自動的に呼び出されます。
スーパークラスのコンストラクタを指定する
スーパークラスにコンストラクタが複数ある場合には、呼び出されるコンストラクタを明示的に指定したい場合があります。
このとき、サブクラスのコンストラクタの先頭で、super()という呼び出しをすることができます。



サブクラスの引数4個のコンストラクタの先頭で、
super(n, a, b);
と記述しています。「引数のないコンストラクタ」ではなく、「引数2個のコンストラクタ」が最初に呼び出されています。つまり、super()を記述すると、スーパークラスのどのコンストラクタを呼び出すかを指定できるのです。
サブクラス内からアクセスする
privateやpublicを指定して、メンバへのアクセスをコントロールし誤りのおきにくいプログラムを作成してきました。
ここでは、サブクラスとスーパークラスという密接な関係にあるクラスについて、どのようにアクセスできるのかを学ぶことにしましょう。
privateメンバにはクラスの外からアクセスすることができません。スーパークラスのprivateメンバには、サブクラスからもアクセスすることができないようになっています。
しかし、サブクラスとスーパークラスは密接な関係にあるので、protectedという指定方法があります。下記のコードを見てください。protectedメンバに書き換えると、BeastCharaクラスからアクセス可能です。


スーパークラスでprotectedを指定することで、
サブクラスからアクセスすることができる
というしくみになっています。