プログラミング応用a 第12回『継承の基礎2』12-3 継承とコンストラクタ |
【12-3 継承とコンストラクタ】
・下図の様な例では,サブクラスのオブジェクトのコンストラクタを呼び出すと,
(1)まずはスーパークラスのデフォルトコンストラクタが自動で呼ばれて,スーパークラスから継承されている部分が初期化され,
(2)その後,サブクラスのコンストラクタが動き出して,サブクラス独自のメンバを初期化していく。
なぜ,このように自動的にスーパークラスのデフォルトコンストラクタが呼び出されるのだろうか。
それは,「サブクラスの中にある"スーパークラスから継承した部分"は,まずスーパークラスの流儀によって初期化しておくべきである。サブクラス独自の部分はその後で初期化する。」という考えがあるからである(下図)。
そのため,Javaのシステムは,
・サブクラスのコンストラクタで明示的にスーパークラスのコンストラクタが
呼び出されていないとき
サブクラスのコンストラクタの冒頭で,自動的にスーパークラスのデフォルトコンストラクタを呼び出そうとするのである。
※もしこのとき,
スーパークラスにデフォルトコンストラクタが存在しなかった場合は,エラーになる。
しかし,Javaのシステムが自動で呼び出せるスーパークラスのコンストラクタは,特定の実引数を具体的に指定しなくても呼び出すことができるデフォルトコンストラクタのみである。
そのため,一般的には次に示すように,サブクラスのコンストラクタを定義するときは,その最初の初期化処理として明示的にスーパークラスのコンストラクタを呼び出すべきである。
・サブクラスのコンストラクタ内からスーパークラスの特定のコンストラクタを,
super( 実引数 );
という形で明示的に呼び出せる。その場合,必ずコンストラクタの一番最初でスーパークラスのコンストラクタを呼び出さなければならない。
※この方法を使って,明示的にスーパークラスのコンストラクタを呼び出した場合は,前述したような「自動的なスーパークラスのデフォルトコンストラクタの呼び出し」は
起こらない。
●例1
●例2
以下の例を見てみよう。クラスBのコンストラクタで,クラスAから継承したフィールドiの初期化を
行う為に,
②でスーパークラスAのコンストラクタを super( i ); という具合に呼び出している。
List 9
■サブクラスにおけるコンストラクタ定義の一般形