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