2013-10-11 58 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中的靜態變量設置的內容」,我知道他不想在第一次設置=之後改變它) –