- ベストアンサー
コンストラクタの種類について教えてください!!
- コンストラクタの種類にはデフォルトコンストラクタ、引数を持たないコンストラクタ、引数を持つコンストラクタがあります。
- LinearLayout ll = new LinearLayout(this)の部分では引数ありのコンストラクタが呼ばれますが、LinearLayout ll = new LinearLayout()のときは引数なしのコンストラクタが呼ばれます。
- デフォルトコンストラクタが呼ばれるときの記述式はコンストラクタ名の後ろに()を付ける形式です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>>このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 > →この場合はJava側が用意するデフォルトコンストラクタが呼ばれるためコンパイルは成功するのでは? 残念ながらそうなりません。 たとえば、 class B { public B(int i) {} // public B() がない } …… B b = new B(); というコードはエラーになります。 この場合、プログラマは引数のないコンストラクタを書いていませんが、コンストラクタ自体は書いているため、Java はデフォルトコンストラクタを用意しません。したがって、引数がないコンストラクタをプログラマと Java との両方とも定義していないため B を引数なしで生成することはできません。 > つまりA a = new A();において呼ばれるコンストラクタはプログラム側が引数なしのコンストラクタを定義していた場合はそれが呼ばれ、定義していない場合はJava側が用意するデフォルトコンストラクタが呼ばれると理解してよろしいでしょうか? 上記の文は、「定義していない場合は」の前に「引数付きのものを含めてプログラム側が一切のコンストラクタを」が入ると正しくなります。引数なしのコンストラクタは書いていないが引数付きのものは書いている場合は最初に書いた通りです。
その他の回答 (2)
- hitomura
- ベストアンサー率48% (325/664)
#1. の回答者ですが、その補足について。 > Aクラスに引数のないコンストラクトがありますと、そのコンストラクトが呼ばれ、Aクラスにコンストラクトが存在しないとデフォルトコンストラクトが呼ばれるのでしょうか? この部分はそのとおりです(語句が間違ってますが)。 しかし、 > つまりA a = new A();の式でもAクラスのコンストラクタが存在するかしないかで2通りの呼び方があるということでいいのでしょうか? の部分は勘違いしています。 A a = new A(); と書いたとき、呼ばれるのはあくまでも引数のないコンストラクタです。 プログラマが何らかのコンストラクタを書いたならばそのうちで引数のないコンストラクタが呼ばれます。このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 プログラマがコンストラクタを一切書かなかった場合は Java が引数のないコンストラクタを用意してそれを呼びます。 この Java が用意した引数のないコンストラクタのことをデフォルトコンストラクタと呼んでいるだけで、インスタンス生成するときにはそのとき使用するコンストラクタがデフォルトかプログラマが書いたものかの区別はありません。
補足
回答ありがとうございます!! 気になる部分があるのですが このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 →この場合はJava側が用意するデフォルトコンストラクタが呼ばれるためコンパイルは成功するのでは? つまりA a = new A();において呼ばれるコンストラクタはプログラム側が引数なしのコンストラクタを定義していた場合はそれが呼ばれ、定義していない場合はJava側が用意するデフォルトコンストラクタが呼ばれると理解してよろしいでしょうか? また回答をいただけるとありがたいです!
- hitomura
- ベストアンサー率48% (325/664)
A a = new A(); ただし、Aにコンストラクタを一切記述していないとき。
補足
すみません A a = new A(); を例にとりますと Aクラスに引数のないコンストラクトがありますと、そのコンストラクトが呼ばれ、Aクラスにコンストラクトが存在しないとデフォルトコンストラクトが呼ばれるのでしょうか?つまりA a = new A();の式でもAクラスのコンストラクタが存在するかしないかで2通りの呼び方があるということでいいのでしょうか?
お礼
理解できました!!こんな夜おそくまでお付き合いありがとうございました!!