• ベストアンサー

静止的フィールドについて教えてください

教えてください。以下のプログラムだとして、 class Box { static int a = 0 ; int b = 0 ; int c = a+4; } class sample { public static void main(String[] args) { Box n = new Box() ; n.a-- ; n.b-- ; n.c[1]-- ; System.out.println("n.a= "+n.a);//-1 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2]="+n.c[2]);//4 Box m = new Box() ; m.a++ ; m.b++ ; m.c[2]++ ; System.out.println("n.a ="+n.a);//0 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2] ="+n.c[2]);//4 System.out.println("m.a ="+m.a);//0 System.out.println("m.b ="+m.b);//1 System.out.println("m.c[2] ="+m.c[2]);//4 } } Box nの中のn.aの値はわかります。 ですが、Box mの中のn.aは、a がstaticフィールド(?)なので元の0に戻りますが、m.aがなぜ0なのかわかりません。 そもそもstatic int = ●; のときは、静止的intと教わったのですが、どういう現象が起こるのかいまいちです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.5

まだ間違いがある・・・; こんなんかな? class Box {  static int a = 0 ;  int b = 0 ;  int c[] = {1, 3, a+4}; } class sample {  public static void main(String[] args) {   Box n = new Box() ;   n.a--;   n.b--;   n.c[1]--;   System.out.println("n.a= "+n.a);   System.out.println("n.b ="+n.b);   System.out.println("n.c[2]="+n.c[2]);   Box m = new Box() ;   m.a++;   m.b++;   m.c[2]++;   System.out.println("n.a ="+n.a);   System.out.println("n.b ="+n.b);   System.out.println("n.c[2] ="+n.c[2]);   System.out.println("m.a ="+m.a);   System.out.println("m.b ="+m.b);   System.out.println("m.c[2] ="+m.c[2]);  } } 処理を追いながら中身の値を確認します。 Box n = new Box(); // n.a = 0, n.b = 0, n.c[0] = 1, n.c[1] = 3, n.c[2] = a + 4 = 4 // m.a = 0, m.b = なし, m.c[0] = なし, m.c[1] = なし, m.c[2] = なし // mはインスタンスが生成されていないのでstatic以外のフィールドは存在しません。 // staticのフィールドはプログラムが実行されたときに1つだけメモリ領域を確保するのでm.aには値がある。 n.a--; // n.a = -1, n.b = 0, n.c[0] = 1, n.c[1] = 3, n.c[2] = 4 // m.a = -1, m.b = なし, m.c[0] = なし, m.c[1] = なし, m.c[2] = なし // n.aとm.aは同じメモリ領域なのでn.aをデクリメントするとm.aもデクリメントされたように見える。 n.b--; // n.a = -1, n.b = -1, n.c[0] = 1, n.c[1] = 3, n.c[2] = 4 // m.a = -1, m.b = なし, m.c[0] = なし, m.c[1] = なし, m.c[2] = なし n.c[1]--; // n.a = -1, n.b = -1, n.c[0] = 1, n.c[1] = 2, n.c[2] = 4 // m.a = -1, m.b = なし, m.c[0] = なし, m.c[1] = なし, m.c[2] = なし Box m = new Box(); // n.a = -1, n.b = -1, n.c[0] = 1, n.c[1] = 2, n.c[2] = 4 // m.a = -1, m.b = 0, m.c[0] = 1, m.c[1] = 3, m.c[2] = a + 4 = 3 // インスタンスが生成されたのはmだけなのでnの値は変化しない。 m.a++; // n.a = 0, n.b = -1, n.c[0] = 1, n.c[1] = 2, n.c[2] = 4 // m.a = 0, m.b = 0, m.c[0] = 1, m.c[1] = 3, m.c[2] = 3 // n.aとm.aは同じメモリ領域なのでm.aをインクリメントするとn.aもインリメントされたように見える。 m.b++; // n.a = 0, n.b = -1, n.c[0] = 1, n.c[1] = 2, n.c[2] = 4 // m.a = 0, m.b = 1, m.c[0] = 1, m.c[1] = 3, m.c[2] = 3 m.c[2]++; // n.a = 0, n.b = -1, n.c[0] = 1, n.c[1] = 2, n.c[2] = 4 // m.a = 0, m.b = 1, m.c[0] = 1, m.c[1] = 3, m.c[2] = 4 >そしてBox mのn.c[2]+m.c[2]の答えが8でした。 >なぜ9じゃなくて8なんだろう?と疑問です・・・ まずint c[] = {1, 3, a + 4}の処理が行われるのはインスタンスが生成されたときです。(このときにa + 4の計算が行われます。) つまりnew Box()のとき。 インスタンスの生成後、aの値を変化させてもa + 4の処理は行われないのでn.a--;やm.a++;を行ったとしてもn.c[2]、m.c[2]の値は変化しません。 こんな説明でどうでしょう?

noname#85912
質問者

お礼

ミスが多くてすいません>< 再びご回答ありがとうございます。ようやくわかりました。 わかりやすいご説明感謝します。

その他の回答 (4)

回答No.4

staticな値はクラスで一つしか存在しないため、新たにオブジェクトを生成しても、演算する値を同じになります。 class Stat{ static int value 10; } class Test{ Stat stat_a = new Stat(); stat_a.value = 15; Stat stat_b = new Stat(); System.out.print(stat_b.value); } これで標準出力した場合、「15」と出力されるということです。 どうでしょうか?

noname#85912
質問者

お礼

わかりやすいご説明、ご回答ありがとうございます! 参考にさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

何の話なのかわからないので, 「きちんと動作するプログラム」を書いてください. あと, JAVA だからファイル名も. じゃないと, 憶測で答えるしかできないので, はっきりいって「時間の無駄」です.

  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.2

まずBoxクラスのcは配列ではないので n.c[1]--; System.out.println("n.c[2]=" + n.c[2]); などは行えません。 staticの説明はNo.1の方が言っているとおりです。 static int aはプログラム全体で1つしか作成できず、プログラムが起動されたときに作成されます。(厳密にはどのタイミングかはわかりませんが・・・。) メモリ領域が1つしか確保されないってことです。 int bはインスタンス毎に作成され、インスタンスを作成するたびに作成されます。 new Box()を行うごとに新しくメモリ領域が確保されます。 メモリ領域イメージ |a|n.b|n.c|m.b|m.c|・・・ つまりn.aとm.aは同じメモリ領域を読み込んでいるので同じ値となります。 Box n = new Box(); // n.a=0,n.b=0, m.a=0, m.b=存在しない n.a--; n.b--; // n.a=-1, n.b=-1, m.a=-1, m.b=存在しない Box m = new Box(); // n.a=-1,n.b=-1, m.a=-1, m.b=0 m.a++; m.b++; // n.a=0,n.b=-1, m.a=0, m.b=1 となります。

noname#85912
質問者

補足

ご回答ありがとうございます。 すいません;; int cを略しすぎました。 int c={1,3,a+4} です。 そしてBox mのn.c[2]+m.c[2]の答えが8でした。 なぜ9じゃなくて8なんだろう?と疑問です・・・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

このコード, コンパイルできないと思うんだが気のせいか? さておき static なフィールドはクラスの全てのインスタンスで共有されます (かつインスタンスなしでアクセスできる). だから m.a と n.a は「同じもの」です.

noname#85912
質問者

お礼

ご回答ありがとうございます。 すいません;; int cを略しすぎました。 int c={1,3,a+4} です。 そしてBox mのn.c[2]+m.c[2]の答えが8でした。 なぜ9じゃなくて8なんだろう?と疑問です・・・