2012-05-21 74 views
2

我知道靜態變量的創建和初始化只有一次I.e當類加載,而不是每個對象。在Java中靜態變量的使用

在下面給出的代碼中,我想要做的是:我在類A中聲明瞭一個靜態變量「a」,並將其賦值爲5.當執行main時,我將其值更改爲6,使程序無限循環。所以目前的「a」值是6.

現在我試圖做的是我試圖從其他類B類訪問此變量時,類A仍然循環,我期望應該打印6當我跑B類(因爲當我跑B級時,「a」值變爲6),但是令人驚訝的是它仍然給我5分。

即使我將「a」聲明爲靜態,爲什麼會發生這種情況?無法弄清楚這種方法有什麼問題。

class A{ 
    static int a=5; 

    public static void main(String args[]){ 
     System.out.println(A.a+""); 
     a=6; 
     while(true){ 
     } 
    } 
} 

class B{  
    public static void main(String args[]){ 
     System.out.println(A.a+""); 
    } 
} 
+2

您正在通過'A.main'和'B.main'運行兩個獨立的程序。您必須在同一個流程中使用線程來展示您期望看到的內容。 –

+1

或更好 - 靜態初始化塊。 –

+0

我不認爲線程是必要的。在B中; 'pubic static void main(String [] args){A。主要(args);系統。出去。 println(A。a +「」); } – emory

回答

4

您正在遇到的問題是,正在運行兩個不同的JVM進程。你應該做的是在自己的線程中運行你的每個「main」方法。這樣他們共享(並因此可以修改)相同的內存。這裏就是你們的榜樣修改爲使用線程:

public class Main{ 
    public static int v = 5; 

    public static void main(String[] args) throws Exception{ 
     new Thread(new A()).start(); 
     Thread.sleep(5000); 
     new Thread(new B()).start(); 
    } 
} 

class A implements Runnable{ 
    public void run(){ 
     System.out.println(Main.v); 
     Main.v = 6; 
    } 
} 

class B implements Runnable{ 
    public void run(){ 
     System.out.println(Main.v); 
    } 
} 

邊注:雖然這個例子並演示一下從問題預期,仍有寫正確 Java程序方面的很多東西不對的使用多個線程。做你的研究。

+0

你對我試圖加載這兩個程序在不同的過程中是錯誤的。謝謝! – user1406427

0

你從來沒有真正運行的主循環A.

只是要改變值的方法。

+0

我首先運行A類,所以「a」值應該改爲6.之後,當A在while循環中被觸發時,我試圖訪問B中的「a」,我得到了5個答案。 – user1406427

+0

你首先在哪裏運行「A」?你將不得不在同一個班上跑這兩個,以得到你想要的。它們現在仍然是兩個獨立的對象,它們之間沒有任何關係。所以你只是訪問變量,並沒有真正改變它,然後用B訪問它。 – OmniOwl

+0

你對我試圖加載兩個程序在不同的進程中是錯誤的。謝謝! – user1406427

0

這是因爲A的主要方法永遠不會被調用。

0

您正在運行兩個java進程和兩個程序。第二類加載器加載class A並設置它的靜態變量至5但在class B沒有呼叫來調用在class A定義的靜態主()方法,它增加至6

+0

你對我試圖加載這兩個程序在不同的過程中是錯誤的。謝謝! – user1406427