Javaのコンストラクタについて質問です。

親クラスAを作成し、子クラスBが親クラスAをextendsするように実装しました。親クラスAにはデフォルトコンストラクタを実装していません。
すると、「デフォルトコンストラクタを実装しろ」というようなエラーが出ました。

なぜ、デフォルトコンストラクタを実装する必要があるのでしょうか。また、デフォルトコンストラクタを使わせたくない場合にはどうすればよいのでしょうか。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/04/25 01:26:09
  • 終了:2011/05/01 23:28:59

回答(2件)

id:nanacy7741 No.1

味わい回答回数81ベストアンサー獲得回数82011/04/25 09:40:03

ポイント50pt

コンストラクタを使わせないということは出来ません。

Javaはコンストラクタを使う思想で作られているから従う歯科ありません。


恐らくGaasuさんは、継承した子クラスに(デフォルトコンストラクタではない)引数ありの

コンストラクタを作ったのでしょう。

それをコンパイルすると、子クラス内で作ったコンストラクタ内でsuper();という1行が

勝手に追加されます。(もちろん明示的に書くこともできる)

super();が書かれないのは、例えばsuper(10);のように明示的にGaasuさんが書いている場合。

親がいないと子もいませんから、子クラスの中で親クラスを生成?することは必須なんです。


super();というのは親のデフォルトコンストラクタを呼び出しています。

Gaasuさんのソースの親クラスにはデフォルトコンストラクタがないんです。


なぜ内科。

引数ありのコンストラクタがあるのでしょう。


対処方法としては、親クラスにデフォルトコンストラクタを書けばいいです。

むしろデフォルトコンストラクタは必ず書く癖を付ければいいと思います。

だって書かなければいけないというJavaのルールですから。



ちなみに、

class Oya {}

class Ko extends Oya {}

これをコンパイルするとコンパイラが勝手にコンストラクタを書いたりするので、

class Oya { public Oya();}

class Ko extends Oya { public Ko(super());}

こんな感じになります。



コンパイラが勝手に作るコンストラクタとsuper();の1行を意識して考えて書いて下さい。

コンパイラは引数なし系しか書きませんからね。



ななブロ(ビジネス、コンピュータ):http://d.hatena.ne.jp/nanacy7741/

id:Gaasu

回答ありがとうございます。

2011/05/01 23:28:32
id:yamayamada No.2

yamayamada回答回数2ベストアンサー獲得回数02011/04/25 14:18:43

ポイント20pt

子クラスで親クラスの引数ありのコンストラクタを呼べばいいです。

id:Gaasu

回答ありがとうございます。

2011/05/01 23:28:31

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません