javaを勉強中なのですが、分からないことがあります。
仮に以下のようなコードがあるとします。
import java.util.*;
public class Cleric1 {
String name;
int hp = 50;
static final int MAX_HP = 50;
int mp = 5;
static final int MAX_MP = 10;
public Cleric1(String name, int x, int y ) {
this.name = name;
this.hp = x;
this.mp = y;
}
public Cleric1(String name, int x) {
this(name,x,Cleric1.MAX_MP);
}
}
上記のコードは、引数が2つのコンストラクタ内において、静的フィールドのMAX_MPを使用していますが、これが仮に通常のフィールド、「mp」などであった場合は、this()の中に引数として使用することはできますでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
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変数にはアクセスできない。
}
↑こういう事になります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
staticフィールドは特別なフィールドです。
staticフィールドは各オブジェクト毎に用意されるものではなく、クラスで共通のものとして扱われます。つまり、オブジェクト生成に関係なく使用できます。(たとえオブジェクトの数が0でも使用できますし、オブジェクトの数が100個あったとしても、1つのstaticフィールドは1つしか用意されない)
一方、コンストラクタはオブジェクトを生成する途上のものであり、thisメソッドの引数に使用する段階における非staticフィールドは準備中みたいな状態のため使用できません。
何か最近static関係の回答ばかりしているような気がする・・・
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-3
public Cleric1(String name, int x) {
this(name,x,this.MP);
}
できます
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2018/05/30 17:22
タイトルには要件を書いて下さい。 https://teratail.com/help/question-tips#questionTips3-1 タイトルから質問内容が想像できないもの、タイトルと質問内容が食い違っているものはスムーズな回答を得られなくなります。
newyee
2018/05/30 17:34
すみません。修正しました
KSwordOfHaste
2018/05/30 17:38
所謂XY問題というんでしょうか・・・。質問者さんは本当にやりたいことがあり、それを実現するために「これはできるか?」と尋ねておられるような気がします。本当にやりたいことを書いた方がより的確なアドバイスが付きやすくなると思います。
newyee
2018/05/30 17:46
ご指摘ありがとうございます。実は、javaの参考書でコンストラクタの勉強していたのですが、何故、静的フィールドは引数に使えるのに、通常のフィールドは使えないのかなと単純に疑問に思ったため、質問させて頂いたんですよね...
KSwordOfHaste
2018/05/30 17:48
おっと、そういうことだったのですね。そういうことならXY問題ではないですね。失礼しました。