• 締切済み

スーパークラスのコンストラクタの処理を引き継ぐ

基本情報18年秋のJava問題問12の設問1(a)の問でわからないことがあるので教えてください。 スーパークラスを継承したクラスのコンストラクタ内の処理を、スーパークラスのコンストラクタと同じ処理する場合の記述についてです。 問題と解答(http://www.jitec.jp/1_04hanni_sukiru/mondai_kaitou.html#18aki)はここですが、簡単に書くと、次のようになります。 抽象クラスBook abstract class Book { String name; String id; Book(String name, String id) { this.name = name; this.id = id; } ~ } Bookを継承したRegularBook class RegularBook extends Book { RegularBook(String name, String id) { ここが穴埋め ; } ~ } 穴埋めの解答群5つのうちの2つが次のとおりです。 エ super(name, id) オ this.name = name; this.id = id もちろんエが正解です。 普通ここにエの記述をするのはわかるのですが、なぜ「オ」が「絶対に間違い」と言い切れるのかが分からないのです。 スーパークラスのコンストラクタ内の処理が変更になった場合、それを継承するクラスのコンストラクタの処理にも反映されるとか、そういう意味でもエの書き方は便利だとは思いますが、オも絶対に間違いといいきれないのでは?? お尋ねしたいのは、情報処理試験の問題として、絶対に間違いでない選択肢を2つ以上もいれるはずもないので、オは「なにがなんでも間違い」なんだろうけれどもその理由が分からないのです。 オが確実に間違っているという理由が分かりましたら教えてください。よろしくおねがいいたします。

みんなの回答

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

オは間違いです。 本来、サブクラスのコンストラクタは、その処理の最初でスーパークラスのコンストラクタを呼び出します。 スーパークラスのコンストラクタが複数ある場合、「どのスーパークラスのコンストラクタを呼ぶか」、 つまりどの引数のコンストラクタを呼ぶのか指定しないといけません。 ただ、一つだけスーパークラスのコンストラクタを省略できる場合があります。 それが、スーパークラスの引数なしのコンストラクタ、つまり「super();」を呼ぶ場合です。 このコンストラクタを呼び出す場合に限り、スーパークラスのコンストラクタの呼び出しを省略できるのです。 (サブクラスのコンストラクタと同じ引数のコンストラクタではない、というのが重要です。 冷静に考えれば当然のことですが。) 言い換えると、引数のないコンストラクタ「以外」を呼ぶ場合は、明示的に記述しないといけません。 というのがJavaの言語仕様です。 これでお分かりでしょう。 RegularBookクラスのスーパークラスBookクラスにはBook()というコンストラクタがありません。 Book(String, String)というコンストラクタしかありません。 なので、RegularBook クラスのコンストラクタは、super(String, String)を必ず定義しないといけないのです。

noname#219128
noname#219128
回答No.1

ま、実際に手を動かすのが早いと言う事で、 提示していただいたサンプルでコンパイルすると「暗黙的スーパー・コンストラクター Book() は未定義です。別のコンストラクターを明示的に呼び出す必要があります。」というエラーがでてきました。 ま、そのまんまということで。

関連するQ&A

専門家に質問してみよう