スーパークラスのコンストラクタ
前回は 継承 (インヘリタンス) についてみました。継承ではフィールドやメソッドについては引継がれますがコンストラクタは引き継がれません。そこで今回はスーパークラスのコンストラクタの呼び出しについてみていきます。
スーパークラスのコンストラクタを実行
【Animal .java】
class Animal {
Animal (){ //(1)
System.out.println("スーパークラスのコンストラクタ1");
}
Animal (int x){ //(2)
System.out.println("スーパークラスのコンストラクタ2");
}
}
スーパークラスです。コンストラクタをオーバーロードしています。
【Birds.java】
class Birds extends Animal {
Birds (){
super(1);
System.out.println("サブクラスのコンストラクタ");
}
}
コンストラクタはインスタンスの生成時に一度だけ呼び出されます。別のコンストラクタを呼び出すときもコンストラクタ内からでないとエラーになります。スーパークラスのコンストラクタの呼び出しは4行目のように
で記述します。superに指定した引数の型や引数の数により、スーパークラスのどのコンストラクタを呼び出すか判断されます。スーパークラスののコンストラクタを実行した後、自分のコンストラクタ処理の続きを行います。
【Sample.java】
public class Sample {
public static void main(String[] args) {
Birds birds = new Birds();
}
}
サブクラスのコンストラクタ
Birdsクラスの3行目の super でスーパークラスであるAnimal クラスのコンストラクタ(2)が呼び出され、その後に自分のコンストラクタの続きが実行されているのがわかります。
super(仮引数, ・・・)の位置
class Birds extends Animal {
Birds (){
System.out.println("サブクラスのコンストラクタ");
super(1);
}
}
Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
コンストラクター呼び出しは、コンストラクター内の
最初のステートメントである必要があります
「super」の位置には制約があります。コンストラクタの一番最初に記述しなければなりません。サンプルのようにコンストラクタの最初のステートメントに書かないとエラーになります。
super(仮引数, ・・・)の省略
サブクラスのコンストラクタでスーパークラスのコンストラクタの呼び出す処理を記述しない場合、どのような処理がされるかみていきます。
【Animal .java】
class Animal {
Animal (){ //(1)
System.out.println("スーパークラスのコンストラクタ1");
}
Animal (int x){ //(2)
System.out.println("スーパークラスのコンストラクタ2");
}
}
【Birds.java】
class Birds extends Animal {
Birds (){
System.out.println("サブクラスのコンストラクタ");
}
}
※コンストラクタに super(仮引数, ・・・) の記述がない
【Sample.java】
public class Sample {
public static void main(String[] args) {
Birds birds = new Birds();
}
}
サブクラスのコンストラクタ
サブクラスであるBirdsクラスのコンストラクタにスーパークラスの呼び出し super(..) がありません。結果をみてみると「スーパークラスのコンストラクタ1」が表示されています。この処理はスーパークラスの引数がないコンストラクタの処理です。つまり、
サブクラスでスーパークラスのコンストラクタの呼び出しを記述しない場合は、自動的にスーパークラスの引数なしのコンストラクタが実行される。
サブクラスでスーパークラスの呼び出しを記述しない場合、スーパークラスには必ず引数なしのコンストラクタを準備する必要があります。もし記述しなければ呼び出し先がないためにエラーになります。しかしスーパークラスにコンストラクタの定義が1つもない場合は、デフォルトコンストラクタが呼び出されるのでエラーにはなりません。引数のあるコンストラクタのみをスーパークラスで定義するときは注意が必要です。
※デフォルトコンストラクタについては「コンストラクタ」記事を参考に
2010 年 6 月 10 日 木曜日 【 カテゴリー: Javaの基本 】
