ホーム > Java > 第5章-4 継承

Java -継承-

継承によりスーパークラスの持つ属性や操作をサブクラスが受け継ぐことができます。

継承される方をスーパークラス、継承する方をサブクラスといいます。

クラスの継承とは

スーパークラスの属性や操作を継承するためにはextendsキーワードを使います。

Javaでは、サブクラスは、スーパークラスを1つしか継承することはできません。
これを単一継承といいます。

継承の書式
class サブクラス名 extends スーパークラス名{…}

サブクラスからnew演算子でインスタンスを生成すると、そのサブクラスのインスタンス内にスーパークラスの インスタンスが生成され、通常は、スーパークラスのデフォルトコンストラクタが自動的に実行されます。

オーバーライド

スーパークラスで定義したメンバ変数やメソッドは、サブクラスで再定義することができます。
これをオーバーライドといいます。

メンバ変数のオーバーライドを行うには、スーパークラスのメンバ変数と同じ名前でサブクラスにメンバ変数を 定義します。

オーバーライドの規則

  1. サブクラスで記述するメソッドのメソッド名、引数の型、引数の数、引数の型の並び順をスーパークラスのメソッドと 同じにする。
  2. サブクラスで記述するメソッドの戻り値の型をスーパークラスのメソッドの戻り値の型と同じにするかそのサブクラスにする
  3. メソッドのアクセス修飾子をスーパークラスと同じにするかそれより緩くする。
  4. サブクラスで記述するスロー例外は、スーパークラスのメソッドがスローする例外か、そのサブクラスにする。

サブクラス内でオーバーライドしたメンバ変数やメソッドを利用する場合は、メンバ変数やメソッドをそのまま指定するか 前に「this.」を付けて明示的に指定します。

オーバーライドをする前のメンバ変数やメソッド(スーパークラスのメンバ変数やメソッド)をサブクラスで利用したい場合は、 前に「super.」をつける。

オーバーライドとオーバーロード

同じ名前のメソッドが複数ある場合は、それはオーバーライドされたものか、オーバーロードによるもののどちらかです。

オーバーライド
メソッド名、引数の型、引数の数、引数の型の並び順が完全に一致
オーバーロード
メソッド名、引数の型、引数の数、引数の型の並び順のいずれかが異なる

共変戻り値

JDK5.0から、サブクラスでオーバーライドするメソッドの戻り値は、スーパークラスの戻り値と同じでなくても、 その戻り値のサブクラスであれば許されるようになりました。これを共変戻り値といいます。

継承とコンストラクタ

メンバ変数とメソッドはスーパークラスからサブクラスへ継承されますが、コンストラクタは、継承されません。

サブクラスのコンストラクタ内でスーパークラスの特定なコンストラクタを実行したい場合は、super([引数の指定]) を利用します。

super([引数の指定])は、自クラス内の別のコンストラクタを呼び出すためのthis([引数の指定])と同様、コンストラクタ の最初の文として記述する必要があります。

コンストラクタの最初にsuper([引数の指定])がない場合は、あるいは、コンストラクタそのものの記述がない場合は、 自動的にスーパークラスのデフォルトコンストラクタを実行します。

継承とinstanceof演算子

instanceof演算子は、あるオブジェクトが、あるクラスまたは、そのサブクラスであるかどうかを判定するために 利用することができます。

finalキーワード

classキーワードの前にfinalを付けると、そのクラスはこれ以上継承することができなくなります。

メソッドでの利用

メソッドの前にfinalを付けるとそのメソッドは、サブクラス内でオーバーライドすることができなくなります。

ローカル変数での利用

ローカル変数の前にfinalを付けると、初期化後は値を変更できなくなります。

メンバ変数での利用

メンバ変数にfinalを付けるとその変数は、宣言時に初期化されるか、コンストラクタによって値を代入するように 記述しなければなりません。