Java -継承-
継承によりスーパークラスの持つ属性や操作をサブクラスが受け継ぐことができます。
継承される方をスーパークラス、継承する方をサブクラスといいます。
クラスの継承とは
スーパークラスの属性や操作を継承するためにはextendsキーワードを使います。
Javaでは、サブクラスは、スーパークラスを1つしか継承することはできません。
これを
単一継承といいます。
class サブクラス名 extends スーパークラス名{…}
サブクラスからnew演算子でインスタンスを生成すると、そのサブクラスのインスタンス内にスーパークラスのインスタンスが生成され、通常は、スーパークラスのデフォルトコンストラクタが自動的に実行されます。
オーバーライド
スーパークラスで定義したメンバ変数やメソッドは、サブクラスで再定義することができます。
これを
オーバーライドといいます。
メンバ変数のオーバーライドを行うには、スーパークラスのメンバ変数と同じ名前でサブクラスにメンバ変数を 定義します。
オーバーライドの規則
- サブクラスで記述するメソッドのメソッド名、引数の型、引数の数、引数の型の並び順をスーパークラスのメソッドと同じにする。
- サブクラスで記述するメソッドの戻り値の型をスーパークラスのメソッドの戻り値の型と同じにするかそのサブクラスにする
- メソッドのアクセス修飾子をスーパークラスと同じにするかそれより緩くする。
- サブクラスで記述するスロー例外は、スーパークラスのメソッドがスローする例外か、そのサブクラスにする。
サブクラス内でオーバーライドしたメンバ変数やメソッドを利用する場合は、メンバ変数やメソッドをそのまま指定するか前に「this.」を付けて明示的に指定します。
オーバーライドをする前のメンバ変数やメソッド(スーパークラスのメンバ変数やメソッド)をサブクラスで利用したい場合は、前に「super.」をつける。
オーバーライドとオーバーロード
同じ名前のメソッドが複数ある場合は、それはオーバーライドされたものか、オーバーロードによるもののどちらかです。
オーバーライド
メソッド名、引数の型、引数の数、引数の型の並び順が完全に一致
オーバーロード
メソッド名、引数の型、引数の数、引数の型の並び順のいずれかが異なる
共変戻り値
JDK5.0から、サブクラスでオーバーライドするメソッドの戻り値は、スーパークラスの戻り値と同じでなくても、その戻り値のサブクラスであれば許されるようになりました。これを共変戻り値といいます。
継承とコンストラクタ
- メンバ変数とメソッドはスーパークラスからサブクラスへ継承されますが、 コンストラクタは、 継承されません。
- サブクラスのコンストラクタ内でスーパークラスの特定なコンストラクタを実行したい場合は、super([引数の指定])を利用します。
- super([引数の指定])は、自クラス内の別のコンストラクタを呼び出すためのthis([引数の指定])と同様、コンストラクタの最初の文として記述する必要があります。
- コンストラクタの最初にsuper([引数の指定])がない場合は、あるいは、コンストラクタそのものの記述がない場合は、 自動的にスーパークラスのデフォルトコンストラクタを実行します。
継承とinstanceof演算子
instanceof演算子は、あるオブジェクトが、あるクラスまたは、そのサブクラスであるかどうかを判定するために利用することができます。
finalキーワード
classキーワードの前にfinalを付けると、そのクラスはこれ以上継承することができなくなります。
メソッドでの利用
メソッドの前にfinalを付けるとそのメソッドは、サブクラス内でオーバーライドすることができなくなります。
ローカル変数での利用
ローカル変数の前にfinalを付けると、初期化後は値を変更できなくなります。
メンバ変数での利用
メンバ変数にfinalを付けるとその変数は、宣言時に初期化されるか、コンストラクタによって値を代入するように記述しなければなりません。