Java 如何使对象A的静态变量对对象B的状态更改不可变
如果我有一些简单的类,例如。问题是此类的实例B可能会影响instace A的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
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)再次将变量设置为2,最后得到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中为静态变量设置的内容”,我理解他不希望在第一次设置之后更改它=)