- ベストアンサー
じゃヴぁ
class Demo{ String title; public Demo(){} public Demo(String t){title=t;} public void showTitle(){System.out.println("Title is" + title);} } class DerivedDemo extends Demo{ public void setTitle(String tt){title = tt;} } class DerivedDemoApp { public static void main(String args[]){ DerivedDemo dd = new DerivedDemo(); dd.showTitle(); } } このようなプログラムなんですが、 このDemoの引数なしコンストラクタを削除するとコンパイルエラーになります。 で、なぜエラーになるかという説明なのですが、テキストによると 「引数なしのコンストラクタが無い場合、super()が挿入される(空のコンストラクタという意味だと思います)Demoクラスを拡張しているDerivedDemoクラスにもコンストラクタが無いためこちらもsuper()を挿入します。しかしここでコンストラクタの連鎖の観点からDerivedDemoクラスのスーパークラスであるDemoクラスには引数の無いコンストラクタが定義されていないためコンパイルエラーとなる」 となっています。 しかし、ここで引数ありのコンストラクタをコメントアウトしてみると・・・なんとコンパイルは通ります。 すると、この説明の「連鎖してるから、コンストラクタの定義がいる」という説明はちょっと違うような気がします。 (1)引数なしのコンストラクタが定義されていない場合、なぜコンパイルエラーになるのでしょう? (2)このテキストの説明は正しいですか?? よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>(1)引数なしのコンストラクタが定義されていない場合、なぜコンパイルエラーになるのでしょう? 引数ありのコンストラクタがあるためです。 コンストラクタが一つも定義されていない場合はデフォルトとして引数なしのコンストラクタが使われる(暗黙で定義される)のですが、コンストラクタが定義されているとそのコンストラクタだけが使われます。 >(2)このテキストの説明は正しいですか?? 一応は正しいと思いますが、デフォルトコンストラクタについての説明が足りないと思います。 #別のところで説明されているのかも知れませんが。。。
その他の回答 (1)
- mi-si
- ベストアンサー率35% (200/567)
http://aglaia.c.u-tokyo.ac.jp/Java/advanced/constructor.html ここの説明が参考になると思います。 DerivedDemo はコンストラクタを定義していないので、デフォルトコンストラクタ、 DerivedDemo(){}が挿入されてしまいます。 しかし、上位のクラスであるclass DemoにはDemo(){}が定義されていないのでクラス継承の不整合が起きエラーになる。 よって、 class DerivedDemo extends Demo{ public DerivedDemo(String t){super();} public void setTitle(String tt){title = tt;} } にするとDemo(){}が無くてもエラーが出なくなると思います。 コンパイラ環境が手元にないのでチェックできませんが。
補足
ありがとうございます。 参考URLを見てみました。 >public DerivedDemo(String t){super();} これではだめでした 正しくは public DerivedDemo(){super("a");} のような感じでした。 デフォルトコンストラクタがsuper()を呼ばないように super("a");を呼ぶようにオーバーライドするということですね?? そもそもなぜよくわからなくなったかというと、 定義されていないコンストラクタを呼んだから といわれましても、 あれ??何も記述しなければ空のコンストラクタが 勝手に追加されるんじゃなかったのか???というところなんです。 僕の理解としては 引数があるコンストラクタを記述してしまうと、 引数が無いコンストラクタが自動的には追加されなくなってしまう・・・ ということかな?と思いました。 これは正しいでしょうか???
お礼
ありがとうございます!! とても助かります。 すっきりしました!! >コンストラクタが一つも定義されていない場合はデフォルトとして引数なしのコンストラクタが使われる(暗黙で定義される)のですが、コンストラクタが定義されているとそのコンストラクタだけが使われます。 すごくわかりやすいです! 僕としては、僕だけでなく、 このような説明を書いてもらったほうが理解しやすいと思うのですが・・・ 連鎖云々よりも、デフォルトコンストラクタ(引数なし)が自動で挿入されない場合、という意味合いの問題に思えます。 とても助かりました。 ありがとうございました!!