2013-07-18 69 views
2

我寫了我的代碼,但現在我試圖改變,看看發生了什麼。最終靜態可以更改嗎?

在對象類字段,

static final String msg="here"; 

而且在同一個對象,在methot

public void givemessage(int no) 
{ 
    System.out.println("look.");  
    System.out.println(msg); 
} 

在這裏它提供了 「這裏」 當我從主調用。但是

public void names(String[] names) 
{ 
    String msg=" - "; 
    System.out.println(msg); 
} 

在這裏,當我從主調用它給 - ,而不是「這裏」,它是最終的靜態。它爲什麼會改變,爲什麼沒有編譯錯誤?或者我誤解了所有的Java?

+2

「names」方法中的局部變量隱藏了靜態變量。 – assylias

+3

哦,好的,謝謝大家。我無法通過閱讀來學習。 – CursedChico

回答

8

您正在使用兩個不同的變量,類變量是不可變的(最終的),但本地的不是,它們具有相同的名稱,但它們不相同。

如果你想驗證這一點,把你的主要方法,如MyClassName.msg =「 - 」,你會看到編譯器會抱怨。

+2

不可變!=最終。他們是兩個不同的概念。事實上,String類是一個不可變的類。請在這裏閱讀進一步的解釋http://stackoverflow.com/a/8798424/2542027 – Multithreader

2

msgnames方法中的局部變量。它不會在課堂上改變變量。

1

它沒有改變。

在這段代碼中,您訪問本地變量。

public void names(String[] names) 
{ 
    String msg=" - "; 
    System.out.println(msg); 
} 

,如果你要訪問的靜態字段:

System.out.println(ClassName.msg); 
1

你定義一個名爲msgnames()方法中的局部變量。它與static final類方法不一樣。方法內的局部變量隱藏類變量。

1

它沒有改變。您已將您的static final成員「隱藏」在局部變量後面。 static final變量仍具有舊值 - 您可以使用XXX.msg訪問它,其中XXX是您的班級的名稱。

4

這就是所謂的陰影...傳遞給System.out.println的字符串是您在名稱方法中定義的字符串,因爲它在類級別上具有更嚴格的範圍。 檢查了這一點http://en.wikipedia.org/wiki/Variable_shadowing

+0

+1教育鏈接:) –

+0

我不同意術語陰影,因爲你仍然可以訪問這兩個變量 –

1

String msg=" - ";是存儲在堆棧而static final String msg="here";一個局部變量是存儲在PermGen的空間直到Java 6的一類級變量(存儲在堆在java7)。簡而言之,您在這裏指的是兩個不同的變量