0

如果我有一些简单的课程,例如。问题是此类的实例 B 会影响实例 A 的j

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。如果我要删除staticthenj将是不可变的testTwo.setJ(2),但我不能拥有这个。

我该如何解决这个问题?

4

3 回答 3

0

如果将变量设为静态,那么如果您更改一次,那么它将在任何地方反映出来当您执行testOne.setJ(1);此操作时,变量设置为 1,但您再次调用testTwo.setJ(2);,因此变量设置为 2,所以最终您得到 2

在我的实际应用程序中, j 需要是静态的(因此私有静态类可以使用它)。 您可以创建一个对象,然后调用实例变量而不使其成为静态

于 2013-10-11T08:05:43.993 回答
0

静态字段对类的所有实例都是通用的。在您的情况下,由于j是静态的,因此对于您为该类创建的任意数量的实例都是通用的。一个实例所做的更改将反映在另一个实例中。

像这样看。

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
于 2013-10-11T08:05:44.303 回答
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;
    }
}
于 2013-10-11T08:09:41.250 回答