2015-06-21 48 views
1

我是Java新手,並試圖自己學習。我寫了下面的代碼,我想知道爲什麼輸出不符合我的預期。下面是我寫的代碼:Java變量作用域 - 實例和類變量

public class Roughwork { 

    public static int classVar = 25; 

    public void getValue(int a){ 
     classVar = a; 
     System.out.println(classVar); 

    } 

    public static void main(String[] args) { 
     Roughwork test = new Roughwork(); 
     System.out.println(classVar); 
     test.getValue(30); 
     System.out.println(classVar); 
    } 

} 

這個程序的輸出是:

25 
30 
30 

我預計輸出爲

25 
30 
25 

究竟發生了什麼,我必須這樣做才能獲得我的預期產出?

+2

刪除'static'關鍵字。然後去閱讀它的功能。 – christopher

+1

@ user2810706你正在改變變量的值。你爲什麼想知道它被改變了? – Maroun

+0

@MarounMaroun:我改變的值是在(getValue)方法中,所以我認爲它將被限制在該方法中,並且最終的classVar值將被視爲25而不是30 – user2810706

回答

3

ClassVar定義爲靜態的。

public static int classVar = 25; 

這意味着它不綁定到Roughwork的實例。如果你願意,這是一個全局變量。你甚至可以從其他類在應用程序中調用這個變量是這樣的:

Roughwork.classVar 

爲了讓您預期的行爲,你的代碼改成這樣:

public class Roughwork { 

    public int classVar = 25; 

    public void getValue(int a){ 
     classVar = a; 
     System.out.println(classVar); 

    } 

    public static void main(String[] args) { 
     Roughwork test = new Roughwork(); 
     System.out.println(test.classVar); 
     test.getValue(30); 
     Roughwork test2 = new Roughwork(); 
     System.out.println(test2.classVar); 
    } 

} 
+0

這似乎並沒有工作..我仍然得到25 30 30 – user2810706

+0

它實際上應該給編譯時錯誤,如果你刪除靜態關鍵字。我將添加一個固定的代碼示例。 – wvdz

0

這是因爲將其更改爲30,不要將其改回25(static意味着它是同一類的所有實例)

System.out.println(classVar); //25 
    test.getValue(30);   //30 
    System.out.println(classVar); //30 - you don't change variable back to 25 

要修復它test.getValue之後添加classVar = 25或刪除static修飾符classVar的定義。

0

靜態變量由類的所有實例共享。並且在實例變量的情況下,每個類的實例都有不同的副本。

靜態變量內存在編譯時分配,它們在加載時加載並在類初始化時初始化,並且在實例變量的情況下,所有內容都在運行時完成。

爲了使這個例子有趣: 創建Roughwork的新實例,嘗試更改值並嘗試一下。

Roughwork test = new Roughwork(); 
Roughwork test2 = new Roughwork(); 
System.out.println(classVar); 

test.getValue(30); 
test2.getValue(25); 
System.out.println(classVar); 

參考這個線程,例如要了解清楚:Class Variable & Instance Variable