人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mimio17
●カテゴリ:コンピュータ 学習・教育
✍キーワード:Java クラス コンストラクタ 教授
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● novtan
●20ポイント

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

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

http://javafaq.jp/S010.html

が詳しいです。

◎質問者からの返答

ありがとうございます。

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

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

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

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

もう少し読んでみます。


2 ● quintia
●50ポイント

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

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つのクラス内に関して

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ