あるクラス内で、コンストラクタを複数設定しているときに
そのコンストラクタで別のコンストラクタを呼び出すときは
thisを使います。
この"this"が先頭に来なくてはいけない理由が分かりません。
ご存知の方おりましたら、ご教授下さいますようお願いします。
まず、訂正を一つしておきましょう。
http://java.sun.com/docs/books/jls/third_edition/html/classes.ht...
厳密には、先頭に必要なのは"自身のクラスの別のコンストラクタ"か"スーパークラスのいずれかのコンストラクタ"です。
それらが明に呼び出されていていないときはスーパークラスの引数無しコンストラクタ super(); を暗黙に呼びます。スーパークラスに引数無しコンストラクタが無い場合――つまり引数付きのコンストラクタだけしか無い場合――コンパイルエラーが発生します。
これが意味するところはつまり、どんな深い階層を持つクラスであっても、その途中がどんなに複雑にコンストラクタが記述されていても、「原始のクラスである Object のコンストラクタまでの呼び出しが確実にされる」ことが保証されるということです。
If a constructor body does not begin with an explicit constructor invocation and the constructor being declared is not part of the primordial class Object, then the constructor body is implicitly assumed by the compiler to begin with a superclass constructor invocation "super();", an invocation of the constructor of its direct superclass that takes no arguments.
http://java.sun.com/docs/books/jls/third_edition/html/classes.ht...
Javaのコンストラクタにこの様な制限があるのは、そのことを保証したいためだとしか考えられません。
この制約がない様な他の言語はたくさんあります。
だから「そうでなければならない」という制約ではなく、「そうあるべきだ」という思想の発露だと私は考えます。
後は余談。「原始のクラスである Object のコンストラクタまでの呼び出しが確実にされる」と書きました。
public class A { public A(int a) { this(); } public A() { this(1); } }
こんなソースを書いてみると"コンストラクタの循環呼び出し"となります。当たり前ですね。しかしこれは、少なくとも一つのコンストラクタは親クラスのコンストラクタを(明であれ暗黙であれ)呼び出さないかぎり"循環呼び出し"を回避することはできない、ということを意味しますね。
今回もご教授下さいまして、ありがとうございました。
スーパークラスのコンストラクタが先頭で呼ばれなくては
いけないというのは、理屈でなんとなく分かりました。
すると、その階層を最下部(最上位?)まで掘り下げていくと、そうですね、Objectクラスまで行き着く
ことになりますね。
上記のことを踏まえて、1つのクラス内に関して
>だから「そうでなければならない」という制約ではなく、「そうあるべきだ」という思想の発露
とするなら、そういうものかと思いました。
今回も丁寧に回答いただき、ありがとうございました!
ありがとうございます。
[S010 A-10]辺りでしょうか。頭で作っておかないと、初期化されていないインスタンス変数等に
アクセスしてしまう可能性がある、のでしょうか。
(値を代入せずともデフォルトで初期化は行われ
ますよね。。)カン違いをしているかもしれないので
もう少し読んでみます。