質問: y; } public Cleric1(String name, int x) { this(name,x,Cleric1.MAX_MP); } } ``` 上記のコードは、引数が2つのコンストラクタ内において、静的フィールドのMAX_MPを使用していますが、これが仮に通常のフィールド、「mp」などであった場合は、this()の中に引数として使用することはできますでしょうか?
回答: ``` public Cleric1(String name, int x) { this(name,x,mp); ``` ↑こういうことをやりたいの? インスタンス変数mpはインスタンスの初期化が終わってないのでこういう使い方はできないですよ。 コメント返しの追記: > > 静的フィールドのMAX_MPが使用できるのに、何故通常のフィールドが使用できないのか > > > staticフィールドは、そのクラスがロードされた瞬間から使用可能になります。 だからjavaで処理を開始した時点で使用可能になっているわけです。 instanceフィールドはinstanceを生成して初めて使用可能になります。 単にjavaで処理を開始した時点で使用できないわけです。 処理の途中で明示的にinstannceを生成する必要があります。 たとえ話として居酒屋を例にしてみます。 staticなものは席に着いた(処理を開始した)らすぐに入手できるものです。 テーブルにセットされている箸などがこれに該当します。 instanceは、注文(生成)しないと入手できません。 焼き鳥や生ビールなどがこれに該当します。 さらに追記(コメント返し2): > > 3つの引数を定義している一つめのコンストラクタ内において > > > ↑これは本来、 ``` public Cleric1(String name, int x, int y ) { // super(); // ↑ソースコード内に記述されていないが、コンパイラとしては暗黙の了解で // サブクラスのコンストラクタ先頭でsuperクラスのデフォルトコンストラクタを呼ぶ // 土台となるinstanceが生成されるので、これ以降「this」を使って変数にアクセスできる this.name = name; this.hp = x; this.mp = y; } ``` ↑こういう事です。 しかし、 ``` public Cleric1(String name, int x) { this(name,x,Cleric1.MAX_MP); // ↑thisキーワードを使ってサブクラスのコンストラクタを呼ぶ場合、 // このコンストラクタ(Cleric1(String,int))先頭では「super()」が呼ばれない。 // 結果として、「this()」が完了するまでinstance変数にはアクセスできない。 } ``` ↑こういう事になります。