Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(コンストラクタのthis()について)
閲覧数:414
掲示板(コンストラクタのthis()について)
名前
匿名
題名 コンストラクタのthis()について
質問内容

質問を評価する
(0ポイント)
Java初心者です。
以下のようなプログラムがあった場合、
2と2’は実質的にやっていることは
同じだと思うのですが
2はエラーになり、2’はOKになるのは
なぜでしょうか?
2の「this.MAXHP」を「Hero.MAXHP」に
変えればよいのは分かるのですが
「this.MAXHP」でダメな理由がわかりません。
ご教授願います。

public class Hero {
    String name;
    int hp;
    static final int MAXHP = 50;
    
    // コンストラクタ1
    Hero (String name, int hp) {
        this.name = name;
        this.hp = hp;
    }

    // コンストラクタ2
    Hero (String name) {
        this(name, this.MAXHP);
    }

    // コンストラクタ2’
    Hero (String name) {
        this.name = name;
        this.hp = this.MAXHP;
    }
}
質問日時 2014-01-05 23:04:43
名前
匿名
回答内容

回答を評価する
(0ポイント)
this(String, int) の引数で thisは使えません。

これは

this(String, int) が実行されるまで オブジェクトが生成されないからです。


2' の場合

 Hero (String name) {
  this(); // または this(null, 0);
  this.name = name;
  this.hp = this.MAXHP;
 }

が実際にコンパイルされるコードだからです。

回答日時 2014-01-06 01:31:20
名前
匿名
回答内容

回答を評価する
(0ポイント)
staticをthisで取るのが変だと言うのは分かるだろか。
回答日時 2014-01-06 20:07:35
名前
匿名
回答内容

回答を評価する
(0ポイント)
質問者です。
ご回答ありがとうございます。

>回答者1さん
>this(String, int) が実行されるまで オブジェクトが
生成されないからです。
とのことですが、
new Hero();
が宣言された時点で、インスタンスは生成されるのでは
ないのですか?
もしそうでないのならば、コンストラクタ1が呼び出さ
れたときは
どの時点でインスタンスが生成され
コンストラクタ1内で、this.〜〜が利用可能になるの
でしょうか?

>回答者2さん
すみません、言葉が足りませんでしたが
仮にMAXHPがstaticじゃないとしても
 this(name, this.MAXHP);
というコードはコンパイルエラーになるよね?
ということが言いたかったんです。
回答日時 2014-01-11 23:30:13
名前
回答内容

回答を評価する
(0ポイント)
ある程度 Java がわかってきて、細かい仕様に疑問を感じるなら仕様書を
読んでみたらいかがでしょうか?
http://docs.oracle.com/javase/specs/index.html
super(...) や this(...) が済むまでインスタンスにはアクセス出来ません。
いつ生成されるかではなく Java 言語の仕様です。
回答日時 2014-01-13 01:39:11
回答内容を入力し、「確認」ボタンをクリックしてください。
ログインしていません。ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 ユーザIDをお持ちでない方は「ID登録」からユーザIDの登録を行ってください。
氏名 匿名
回答内容
 



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道