2011-09-27 115 views
34

可能重複:
private final static attribute vs private final attribute靜態最終變量

什麼是變量聲明爲

static final int x = 5; 

final int x = 5; 
之間的區別

如果我只想將變量設爲本地,並且常量(以後不能更改)?

謝謝

+2

如果這是一個變量(而不是字段),它根本不能是靜態的。 – Thilo

+0

這已經在此[問題]中討論過(http://stackoverflow.com/questions/1415955/private-final-static-attribute-vs-private-final-attribute)。 –

+0

這與當前標記不重複。這個問題是關於在方法局部變量中使用「static final」的問題,鏈接問題將它用作類/對象變量(在任何方法定義之外)。我認爲答案是,在方法中使用「final」可以做到人們可能期望的「靜態最終」在大多數情況下在這種情況下做的事情。然而,我想知道如果它是一個對象而不是一個整數,如果可變性可能產生不同於這種直覺的結果。我沒有測試過這個。有人知道嗎? – Apriori

回答

31

只是最後會有預期的效果。

聲明靜態正在成爲一個類變量,這將是通過類名<ClassName>.x.

5

在第一條語句定義變量,它通用於所有對象(類靜態字段)進行訪問。

在定義變量的第二個語句,屬於每個創建的對象(很多拷貝)。

在你的情況,你應該使用的第一個。

29

聲明的字段作爲「最終」將確保字段是一個常數,不能改變。 區別在於使用'static'關鍵字。

聲明一個字段爲靜態意味着它與類型和不與實例相關聯。即對於所有對象只有一個字段副本存在,而不是每個對象的單個副本。 因此,可以通過類名訪問靜態字段。

正如你所看到的,你的要求,即場應該是恆定的在這兩種情況下(聲明字段「最終」和「靜最終」)的實現。

類似的問題是private final static attribute vs private final attribute

希望它可以幫助

3

對於基本類型,在「最後的靜態」將是一個適當的聲明來聲明一個常量。當它是一個對象的常量引用時,非靜態的最終變量是有意義的。在這種情況下,每個實例都可以包含自己的引用,如JLS 4.5.4所示。

見帕維爾對正確答案的響應。