Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使对象A的静态变量对对象B的状态更改不可变_Java_Variables_Static_Scope_Immutability - Fatal编程技术网

Java 如何使对象A的静态变量对对象B的状态更改不可变

Java 如何使对象A的静态变量对对象B的状态更改不可变,java,variables,static,scope,immutability,Java,Variables,Static,Scope,Immutability,如果我有一些简单的类,例如。问题是此类的实例B可能会影响instace 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(因此p

如果我有一些简单的类,例如。问题是此类的实例B可能会影响instace 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
类可以使用它)。然而,当我将其设置为
静态时,我遇到了一个问题,在上面的示例中就是这样。如果我们创建该类的两个单独实例,我可以说明问题:

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)
是不可变的,但是我不能有这个


如何解决这个问题?

如果一个变量是静态的,那么如果您更改一次,它将反映在所有地方 当您执行
testOne.setJ(1)时变量设置为1,但再次调用
testTwo.setJ(2)
在我的实际应用程序中,j需要是静态的(因此私有静态类可以使用它)。

您可以创建一个对象,然后调用实例变量而不使其成为静态的

静态字段对于类的所有实例都是通用的。在您的例子中,由于
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

这不是错误,这是正确的行为。如果您确实需要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;
    }
}

嗯,是的。这就是
static
所做的。如果您想再次设置它怎么办?!从作者的观点来看:“它覆盖了我之前在testOne中为静态变量设置的内容”,我理解他不希望在第一次设置之后更改它=)