2013-01-07 91 views
3

讓有三類命名Tester_1Tester_2Tester_3。他們被定義爲:當我設置布爾值:true時,爲什麼會得到默認值false?

Tester_1:

class Tester_1 { 

public static void main(String args[]) { 
    Tester_2.setBoolean(true); 
    System.out.println(Tester_2.getBoolean()); 
} 
} 

Tester_2:

class Tester_2 { 

public static boolean var = false; // Static var 

public static void setBoolean(boolean value) { 
    var = value; 
} 

public static boolean getBoolean() { 
    return var; 
} 

} 

Tester_3:

class Tester_3 { 
public static void main(String args[]) { 
    System.out.println(Tester_2.getBoolean()); 
} 
} 

後我編譯所有的三個班,我在下面的順序運行它們:

java Tester_1 

java Tester_3 

,但我得到這樣的輸出:從第一次運行

真正從第二次運行。這是爲什麼 ?當Tester_1將布爾值設置爲值true當我運行Tester_3時,爲什麼我會得到默認的false

回答

7

static只在Java虛擬機(JVM)的水平有效。

每當您撥打java xxx時,您都會創建一個新的JVM,它不會與以前的調用共享任何內容=>所有靜態變量都會再次獲得其默認值。

+0

有沒有什麼辦法可以在現有的JVM中綁定新進程'java Tester_3'? –

+1

我不認爲你可以 - 但你總是可以從第一個程序中調用'Tester_3.main()'。你也許可以更詳細地解釋你想要達到的目標。 – assylias

1

因爲靜態變量在JVM中靜態地保存它們的值,但不在JVM之間保存。一旦JVM進程退出,內存中的變量值就會被銷燬。當第二個JVM啓動時,一切都會重新初始化。

如果你需要保持整個運行值,你必須堅持的地方他們(文件系統或例如數據庫)。

+0

否則不是文件系統或數據庫,是否有其他方法來保存值? –

+0

有很多方法,但是如果你認爲文件系統或數據庫已經太難了,你會感到震驚。根據您要存儲的內容的複雜程度,如果文件系統是簡單數據(如布爾型),則使用文件系統。閱讀關於序列化和外化。 http://stackoverflow.com/questions/817853/what-is-the-difference-between-serializable-and-externalizable-in-java – mprivat

0

很簡單,因爲你正在運行的兩個不同的過程。意味着你有兩個不同的電源,這意味着它將有2個不同的執行路徑。

每個進程都會創建新的JVM,以便您的靜態變量1st在第二個JVM中不起作用。

0

兩個單獨的執行 - >不同的結果。

JVM使它變得更有趣,因爲它擦除了每次執行的先前數據。

0

java Tester_1

這是程序的第一次運行。 (即,處理)

java Tester_3

這是程序的第二運行。 (另一個進程)

static值在進程內保留。不跨越流程。

相關問題