継承とコンストラクタ
サブクラスのオブジェクトの初期化
サブクラスのインスタンスの生成の場合、コンストラクタの関係はどのようになっているのでしょう?
サブクラスのメンバはスーパークラスに定義されています
オブジェクトの初期化は、サブクラスのコンストラクタだけでは不十分ですね
サブクラスのインスタンスを生成するとき、スーパークラスのコンストラクタを呼び出す必要があります
さらに、スーパークラスのコンストラクタはサブクラスのコンストラクタよりも先に呼び出さなければ行けません
スーパークラスのメンバは、サブクラスのコンストラクタが実行される前に適切に初期化されていなければならないのです
しかし、私たちはこれまでスーパークラスのコンストラクタの呼び出しなどはしていません
にもかかわらず、なぜ正常にインスタンスが生成できたのか
実は、明示的な指定がない場合
コンストラクタの最初に行にスーパークラスのコンストラクタを呼び出していたのです
これは、コンパイラが暗黙のうちに行っています。呼び出されるコンストラクタは既定のパラメータのないコンストラクタです
class super_class {
super_class() {
System.out.println("ひざの上の同居人");
}
}
class sub_class extends super_class {
sub_class() {
System.out.println("カードキャプターさくら");
}
}
class test {
public static void main(String args[]) {
sub_class obj = new sub_class();
}
}
sub_classのオブジェクト作成時にsub_class()コンストラクタを呼び出しています
sub_class()コンストラクタの先頭で、暗黙的にスーパークラスのコンストラクタsuper_class()を呼び出します
実行結果は次のようになりました
ひざの上の同居人
カードキャプターさくら
最初にスーパークラスのコンストラクタが実行されていることが確認できますね
ただし、呼び出されるのは既定のコンストラクタだけです
そうではなく、スーパークラスのコンストラクタにもパラメータを渡したい場合はsuperキーワードを使います
super(args);
書式はthisキーワードと同じです
必ずコンストラクタの先頭に記述します。それ以外はできません
ひとつのコンストラクタではsuper()かthis()の一方しか呼び出せないのです
class super_class {
super_class(String str) {
System.out.println(str);
}
}
class sub_class extends super_class {
sub_class(String str1 ,String str2) {
super(str1);
System.out.println(str2);
}
}
class test {
public static void main(String args[]) {
sub_class obj = new sub_class("ひざの上の同居人" , "カードキャプターさくら");
}
}
こうすることで、明示的にスーパークラスのコンストラクタを呼び出すことができます
super(args)
スーパークラスのコンストラクタを呼び出します
super()キーワードは、必ずコンストラクタの先頭に記述します