teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

さらに追記

2018/05/31 00:34

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -23,4 +23,37 @@
23
23
  staticなものは席に着いた(処理を開始した)らすぐに入手できるものです。
24
24
  テーブルにセットされている箸などがこれに該当します。
25
25
  instanceは、注文(生成)しないと入手できません。
26
- 焼き鳥や生ビールなどがこれに該当します。
26
+ 焼き鳥や生ビールなどがこれに該当します。
27
+
28
+
29
+
30
+ さらに追記(コメント返し2):
31
+
32
+ > 3つの引数を定義している一つめのコンストラクタ内において
33
+
34
+ ↑これは本来、
35
+
36
+ ```
37
+ public Cleric1(String name, int x, int y ) {
38
+ // super();
39
+ // ↑ソースコード内に記述されていないが、コンパイラとしては暗黙の了解で
40
+ // サブクラスのコンストラクタ先頭でsuperクラスのデフォルトコンストラクタを呼ぶ
41
+ // 土台となるinstanceが生成されるので、これ以降「this」を使って変数にアクセスできる
42
+ this.name = name;
43
+ this.hp = x;
44
+ this.mp = y;
45
+ }
46
+ ```
47
+
48
+ ↑こういう事です。
49
+ しかし、
50
+
51
+ ```
52
+ public Cleric1(String name, int x) {
53
+ this(name,x,Cleric1.MAX_MP);
54
+ // ↑thisキーワードを使ってサブクラスのコンストラクタを呼ぶ場合、
55
+ // このコンストラクタ(Cleric1(String,int))先頭では「super()」が呼ばれない。
56
+ // 結果として、「this()」が完了するまでinstance変数にはアクセスできない。
57
+ }
58
+ ```
59
+ ↑こういう事になります。

1

追記

2018/05/31 00:33

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -5,4 +5,22 @@
5
5
 
6
6
  ↑こういうことをやりたいの?
7
7
 
8
- インスタンス変数mpはインスタンスの初期化が終わってないのでこういう使い方はできないですよ。
8
+ インスタンス変数mpはインスタンスの初期化が終わってないのでこういう使い方はできないですよ。
9
+
10
+
11
+ コメント返しの追記:
12
+
13
+ > 静的フィールドのMAX_MPが使用できるのに、何故通常のフィールドが使用できないのか
14
+
15
+ staticフィールドは、そのクラスがロードされた瞬間から使用可能になります。
16
+ だからjavaで処理を開始した時点で使用可能になっているわけです。
17
+
18
+ instanceフィールドはinstanceを生成して初めて使用可能になります。
19
+ 単にjavaで処理を開始した時点で使用できないわけです。
20
+ 処理の途中で明示的にinstannceを生成する必要があります。
21
+
22
+ たとえ話として居酒屋を例にしてみます。
23
+ staticなものは席に着いた(処理を開始した)らすぐに入手できるものです。
24
+ テーブルにセットされている箸などがこれに該当します。
25
+ instanceは、注文(生成)しないと入手できません。
26
+ 焼き鳥や生ビールなどがこれに該当します。