
新しくメンバを付け加えるように、サブクラスを拡張してきました。サブクラスで新しくメソッドを記述するときには、
スーパークラスとまったく同じメソッド名・引数の数・型をもつメソッドを定義することができる
ようになっています。
すでに設計したCharacterクラスのshow()メソッドとサブクラスであるBeastCharaのshow()メソッドがまったく同じ引数の型・数・メソッド名を持っている場合はどうなるでしょうか?下記のコードを見てください。



show()メソッドを呼び出した結果、サブクラスのshow()メソッドが呼び出されていることがわかります。
このように、サブクラスのメソッドがスーパークラスのメンバにかわって機能することをオーバーライドと呼んでいます。
スーパークラスの変数でオブジェクトを扱う
サブクラスの変数を用意して、オブジェクトをさすようにしました。実は、サブクラスのオブジェクトはスーパークラスの変数で扱うこともできるようになっています。

実行結果からオーバーライドが行われていることがわかります。
オブジェクトをさす変数のクラスに関係なく、オブジェクト自身のクラスによって、適切なメソッドが呼び出される
ただし、サブクラスで新しく定義したメソッドをそのまま呼び出すことはできません。
オーバーライドの重要性を知る

上記のコードからスーパークラスの配列変数を使って、スーパークラスやサブクラスのオブジェクトを一緒に扱っています。
show()メソッドを定義することにより、配列で扱うオブジェクトがどのクラスのものであっても対応した処理が適切に行われることになります。
オーバーライドが行われることにより、スーパークラスとサブクラスのオブジェクトをまとめて扱えるようになっています。
1つのメソッド名がその状況に応じていろいろな働きをすることを、多態性(ポリモーフィズム)と呼びます
スーパークラスと同じ名前のメンバを使う
下記のコードを見てください。

サブクラス内でsuper.をつけてメソッドを呼ぶと、スーパークラスのメソッドの定義を利用して、サブクラスのメソッドを記述できます。
また、super.はフィールドにもつけることができます。スーパークラスの変数にアクセスしたい場合に、super.をつけます。

finalをつける
サブクラスによってオーバーライドされたくない場合は、メソッドの先頭にfinalをつけると、オーバーライドされないようにすることができます。

また、オーバーライドだけでなく、サブクラス自体を拡張したくない場合があります。この時は、クラスの先頭にfinalをつけておきましょう。

最後に、finalをフィールドの先頭につけた場合を見てみましょう。

フィールドに付けたfinalは、「フィールドの値を変更できません」という意味です。この決まった数をあらわすフィールドを、定数といいます。
- メソッドにfinalをつけると、サブクラスでオーバーライドができなくなる。
- フィールドにfinalをつけると、値を変更できなくなる。
- クラスにfinalをつけると、クラスを拡張できなくなる。
すでに設計したクラスを継承すると、より効率的にプログラムを作成していくことができます。「継承」は、クラスの強力な機能のひとつです。