抽象クラスのコンストラクタ
出力はどれか。
public class Main {
public static void main(String[] args) {
new Dog();
}
}
abstract class Animal {
Animal() { System.out.print("Animal "); }
}
class Dog extends Animal {
Dog() { System.out.print("Dog"); }
}
- A
Animal Dog - B
Dog - C コンパイルエラーになる
- D
Dog Animal
正解と解説を見る
正解: A
- A: 抽象クラスもコンストラクタを持てます。new Dog() で先に Animal() が呼ばれ、Animal Dog と出力されます。
- B: 抽象クラスのコンストラクタも、子のコンストラクタの暗黙の super() で呼ばれます。
- C: 抽象クラスにコンストラクタを書くことは問題ありません (new できないだけです)。
- D: 親のコンストラクタが先に実行されるので、Dog が先にはなりません。
ポイント
- 抽象クラスは new できませんが、コンストラクタを持てます。サブクラスを new すると呼ばれます。
- 抽象メソッドが1つも無い抽象クラスも作れます。