• ベストアンサー

違うクラスからの変数の共有化

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{  public static int i;  public Var(int i){ this.i = i; }  public Var(){}  public static void getI(){   return i;  } } //クラス1 //Class1.java public class Class1{  Var var = new Var(1); } //クラス2 //Class2.java public class Class2{  Var var = new Var();  System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。

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

  • ベストアンサー
  • snuffy
  • ベストアンサー率53% (33/62)
回答No.3

Class1 のインスタンス Var var = new Var(1); Class2 のインスタンス Var var = new Var(); これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。 Class1 で値を入れた static 領域を Class2 で参照するには、 public class Class2{ // Var は大文字(クラス名)  System.out.println(Var.getI()); } とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。 ※参考 public Var(int i){ this.i = i; } この書き方は実行はできますが、意味的には正しくありません。staticメンバ は new しないでアクセスされることが前提なので、 Var.setI(i); Var.i = 1; というような書き方が良いと思います(new はしません)。

ryo-3
質問者

お礼

なるほど…。 確かに、明らかにnewと書いているわけですから、別なメモリ空間に同じクラスオブジェクトが生成されるわけなんですねっ~。 よく分かりました! ありがとうございました。

その他の回答 (3)

  • lawson
  • ベストアンサー率44% (29/65)
回答No.4

あれ、ryo3って、ダックスフンド飼ってない? 人違いかな?

ryo-3
質問者

補足

犬は飼いたいんですが、飼っていないですねぇ~。 人違いですm(_ _ )m

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

そういうことですか。 別のメモリ空間で動いているので共有されていないのでしょう。

ryo-3
質問者

お礼

Socketを使っている限りメモリ空間が別々になるんですね…。 どうもありがとうございました。

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.1

ソースが完全ではないのでなんともいえませんが、 ちゃんと書けば結果は1になるはずです。 省略されているところになにか問題があるのかもしれません。

ryo-3
質問者

補足

ローカル間でSocketを用いてクラス1とクラス2をつないでいます。 しかし、同じディレクトリで実行しています。 それが問題なのでしょうか・・・

関連するQ&A