明解Java入門編 第12章まとめ
派生と継承
あるクラスをコピーして、部分的な追加・修正を施すプログラミングを続けていくと、互換性のないクラスが溢れかえってしまうため、プログラムの開発効率・拡張性・保守性が低下することになる。そのためソースプログラムの安易な切り貼りによって新しいクラスを作るべきではない。
このような問題を解決するのがクラスの派生である。
派生とは
既存クラスのフィールドやメソッドなどの資産を継承した新しいクラスを作り出すこと。
フィールドやメソッドを追加したり上書きすることもできる。
派生元のクラス(呼び方)
親クラス/上位クラス/基底クラス/スーパークラス
派生したクラス(呼び方)
子クラス/下位クラス/派生クラス/サブクラス
サブクラスはスーパークラスのフィールドやメソッドなどの資産を継承するとともに、それを部分として含むクラスである。
派生とコンストラクタ
クラスの派生においてコンストラクタは継承されない。
コンストラクタの先頭でsuper(...)を実行することによって、スーパークラスのコンストラクタを呼び出せる。
明示的にsuper(...)を呼び出さないコンストラクタの先頭行には、スーパークラスに所属する「引数を受け取らないコンストラクタ」を呼び出すsuper();が挿入される。
コンストラクタを一個も定義しないクラスには、x(){super();}という形式のデフォルトコンストラクタが自動的に定義される。
クラスにコンストラクタを定義しない場合、そのスーパークラスが「引数を受け取らないコンストラクタ」を持っていなければならない。
「super.メンバ名」によって、スーパークラスのメンバをアクセスできる
Objectクラス(親玉クラス)
明示的な派生の宣言をしないクラスはObjectクラスのサブクラスとなる。
javaのすべてのクラスはObjectクラスの下位クラスである。
差分プログラム
継承のメリットの一つに「既存プログラムに対する必要最低限の追加・修正だけで新しいプログラムが完成する」という差分プログラムが行えるということがあげられる。プログラム開発時の効率アップや保守性の向上が図れる。
is-Aの関係
スーパークラス型の変数はサブクラスのインスタンスを参照できるが、サブクラス型の変数はスーパークラスのインスタンスは参照できない。(明示的なキャスト演算子を適用しなければならない)
メソッドのクラス型引数に対しては、そのクラス型のインスタンスへの参照だけでなく、そのクラスの下位クラス型のインスタンスへの参照を渡すことができる。
メソッドのオーバーライド
スーパークラスのメソッドと同形式のメソッドに、サブクラスで別の定義を与えることをオーバーライドすると表現する。
@Overridアナテイション
コメントより高度な注釈で、人間だけでなくコンパイラにも読ませる注釈。
スーパークラスのメソッドをオーバーライドするメソッドには@Overrideアナテイションをつけて宣言すると良い。
メンバ
クラスの派生で継承されるのはクラスのメンバに限られることになっている。
・フィールド
・メソッド
・クラス
・インターフェース
スーパークラスのメンバは原則としてそのまま継承される。
ただし、非公開アクセス性を持つメンバ(private宣言されたメンバ)は継承されない。
メンバではないクラスの資産
・インスタンス初期化子
・静的初期化子
・コンストラクタ
これらの資産は継承されない。
finalなクラスとメソッド
finalクラスのメソッドはすべてfinalメソッドとなる。
finalクラス
final付きで宣言されたクラスやメンバは派生において特別な扱いを受ける。
finalクラスから派生を行うことはできない。拡張すべきでないクラスは(勝手にサブクラスを作られると困る)finalクラスとして宣言すること。
finalメソッド
finalメソッドはサブクラスでオーバーライドすることができない。サブクラスでオーバーライドされるべきではないメソッドはfinalメソッドとして宣言すること。