• ベストアンサー

Javaのコンストラクタについて教えてください

Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

コンパイルして動かしてみればわかります。 > b() {}についてはclass bのパラメータのあるコンストラクタb(String s)が >サブクラスclass cから明示的に呼ばれていないので >デフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 これはその通りです。 そして、クラスbのデフォルトコンストラクタb()は、 クラスaのデフォルトコンストラクタa()を呼びだします。 クラスcのコンストラクタが、パラメータつきのbのコンストラクタb(String)を使っていたら、 a(){}は必要なかったのですが、 c()の時点でbのデフォルトコンストラクタb(){}を呼んでいる→ b(){}はaのデフォルトコンストラクタa(){}を呼んでいる→ a(){}がないとエラーになる。 というつながりになってます。 ついでながら、クラス名は大文字で始めるようにしましょう。 あとで見る人のための慣習です。

KuroGin
質問者

お礼

liar_adan 殿 ご親切な回答ありがとうございました。 よくわかりました。 また質問の機会がありましたら、ご教示よろしくお願いいたします。                 KuroGin

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 -verboseオプションをつけてコンパイルしてみるとよく分かるのだが、aとbのデフォルトコンストラクタ両方を削ってコンパイルすると、bのコンストラクタが無いと怒られるのは「クラスcのコンパイル時」だ。  つまり、クラスcにデフォルトコンストラクタがあろうとなかろうと、クラスcをインスタンス化する時にc(string)を使おうと使うまぁと、クラスc自体がクラスbのデフォルトコンストラクタを欲しているのが分かる。 なので、 > b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 という訳やね。もちろん c(String s) { super(s); System.out.println("In c's constructor..."); System.out.println(s); } とすればクラスbのデフォルトコンストラクタを欲しなくなる。 これは、「派生クラスのコンストラクタでは、明示的に何かのsuper(引数)を呼び出さないと、裏でsuper()が呼ばれる」という言語仕様からやね。

KuroGin
質問者

お礼

anmochi 殿 ご親切な回答ありがとうございました。 また質問の機会ができましたら、よろしくご教示ください。                  KuroGin

関連するQ&A

専門家に質問してみよう