2013-10-11 19 views
0

如果我有一些简单的类如。问题是这个类的实例B可能影响实例A的j如何使对象的静态变量不可变对象B上的状态变化

public class Tester { 
    private static int j; 

    public Tester() { 
    } 

    public void setJ(int i){ 
     this.j = i; 
    } 

    public int getJ() { 
     return j; 
    } 
} 

在我的现实世界的应用程序,j必须static(所以private static类可以使用它)。但是,当我在上面的示例中制作static时遇到问题。如果我们创建这个类的两个单独的实例,我可以显示问题:

Tester testOne = new Tester(); 
Tester testTwo = new Tester(); 

testOne.setJ(1); 
testTwo.setJ(2); 

System.out.println(testOne.getJ()); //returns 2 

然后在testTwo设置静态变量,它覆盖了我以前设置为在testOne静态变量。如果我要删除static然后j将是不可变的相对于testTwo.setJ(2),但我不能有这个。

我该如何解决这个问题?

+0

嗯,是的。这就是'静态'所做的。 – roippi

回答

0

如果一个变量是由静态那么如果你改变一次,然后它会到处 反映当你正在做testOne.setJ(1);的变量设置为1,但你又是如此再次调用testTwo.setJ(2);变量设置为2,所以最后你得到2

在我的现实世界的应用程序,j需要是静态的(所以私人静态类可以使用它)。 您可以创建一个对象,然后调用实例变量而不使其变为静态

0

静态字段对于该类的所有实例都是通用的。在你的情况下,因为j是静态的,所以你为这个类创建的任何数量的实例都是通用的。这是由1个实例所做的更改将体现在另一个实例中。

看到这样。

There is a static `j` - since its static, it'll be initialized to 0 by default. 
j = 0 // initially 

testOne.setJ(1) // This makes j = 1 
j = 1 // Now 

testTwo.setJ(2) // This makes j = 2, since j is shared by all instances of your class(property of static fields) 
j = 2 // Finally 
0

这不是一个错误,它是正确的行为。如果你真的需要像刚刚解释的smtg,你可以试试这样的方式:

public class Tester { 
    private static int j; 
    private boolean jWasSet; 

    public Tester() { 
    } 

    public void setJ(int i){ 
     if (!jWasSet) { 
      this.j = i; 
      jWasSet = true; 
    } 

    public int getJ() { 
     return j; 
    } 
} 
+0

如果你想再次设置它,该怎么办? – SudoRahul

+0

从这个作者的角度来看:“它覆盖了我之前为testOne中的静态变量设置的内容”,我知道他不想在第一次设置=之后改变它) –