お世話になっております。JAVAに関しての質問です。

あるクラス内で、コンストラクタを複数設定しているときに
そのコンストラクタで別のコンストラクタを呼び出すときは
thisを使います。
この"this"が先頭に来なくてはいけない理由が分かりません。
ご存知の方おりましたら、ご教授下さいますようお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/19 16:54:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:NOV1975 No.1

回答回数50ベストアンサー獲得回数2

ポイント20pt

Javaでは文法上別のコンストラクタを呼ぶのはコンストラクタの先頭でしか許されていません。

そのあたりの話については

http://javafaq.jp/S010.html

が詳しいです。

id:mimio17

ありがとうございます。

[S010 A-10]辺りでしょうか。頭で作っておかないと、初期化されていないインスタンス変数等に

アクセスしてしまう可能性がある、のでしょうか。

(値を代入せずともデフォルトで初期化は行われ

ますよね。。)カン違いをしているかもしれないので

もう少し読んでみます。

2006/06/19 16:34:23
id:quintia No.2

回答回数562ベストアンサー獲得回数71

ポイント50pt

まず、訂正を一つしておきましょう。

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);
        }
    }

こんなソースを書いてみると"コンストラクタの循環呼び出し"となります。当たり前ですね。しかしこれは、少なくとも一つのコンストラクタは親クラスのコンストラクタを(明であれ暗黙であれ)呼び出さないかぎり"循環呼び出し"を回避することはできない、ということを意味しますね。

id:mimio17

今回もご教授下さいまして、ありがとうございました。

スーパークラスのコンストラクタが先頭で呼ばれなくては

いけないというのは、理屈でなんとなく分かりました。

すると、その階層を最下部(最上位?)まで掘り下げていくと、そうですね、Objectクラスまで行き着く

ことになりますね。

上記のことを踏まえて、1つのクラス内に関して

>だから「そうでなければならない」という制約ではなく、「そうあるべきだ」という思想の発露

とするなら、そういうものかと思いました。

今回も丁寧に回答いただき、ありがとうございました!

2006/06/19 16:51:12

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません