2011-06-27 166 views
1

變量聲明爲static以獲取其值的最新單一副本;這意味着價值將在某個地方發生變化。但爲什麼要聲明同一個變量爲final,這將不允許變量在其他位置(常量值)被更改?爲什麼變量應聲明爲靜態和最終

+7

我認爲你有「靜」混淆「揮發」。 –

+3

(爲什麼人們喜歡這樣的問題?) –

+0

@Stephen C:如果至少有3人(包括你)不同意upvotes:爲什麼沒有人倒退它? –

回答

-1

最終停止繼承了它

+2

恩,這是一個字段... –

+1

最後的'fields'可以被子類訪問。公衆的訪問任何地方。 –

+0

@Peter:最終與可達性正交。 –

1

當地variables是在堆棧上,並沒有任何的靜態類。

您可以有一個靜態的field這可能是也可能不是最終的。如果它不會改變的話,你會讓這個區域成爲最後的決定。

8

static這樣就可以在不創建類實例的情況下訪問該變量或方法,並且每個實例只有一個變量而不是一個變量。

A final class不能擴展。一個final變量不能改變它的值,它表現爲一個常量。並且方法不能被覆蓋。

2

聲明爲靜態的變量表示其值由該類的所有實例共享。將變量聲明爲final會使性能稍微好一些,並使代碼更易讀。

+2

我寧願將它看作「與類型相關而不是類型的任何實例」 - 「由所有實例共享」表示必須有*至少一個*實例,但情況並非如此。 –

1

static final在Java中用於表示常量。靜態用於表示類變量,因此不需要爲該類實例化對象以訪問該變量。

最終方法不能被覆蓋,最終變量只能被初始化一次。

如果您只使用static關鍵字,則該值不會是一個常量,因爲它可以再次初始化。

1

static字段可以修改(例如public static字段可以被任何類別修改)。初始化後無法修改static final字段。

1

靜態與獲取最新和單一副本無關,除非這裏的「單一副本」意味着一個類的所有實例都具有相同的值(但是,我認爲您可能會將其與volatile混淆)。靜態意味着類變量。當你希望它是一個常量時,你可以做到最終結果(這實際上是Java常量聲明的方式:static final)。

+0

'靜態'確實是關於「單一副本」,如果你有兩個賦值給某個字段'o1.x = 0; o2.x = 1;'那麼除非該字段是靜態的,否則當讀取'o1.x'時後面的賦值可能不可見。 (不要說這個問題是有道理的,只是說他不確定他確實將它與易失性混合在一起。) – aioobe

+0

感謝您指出這一點,我將對其進行編輯以使其清晰。 –

1

可能會提供類似於constants的東西。

-1

您創建了static final變量以使其值無需實例化對象即可訪問。 例如: -

public class MyClass 
{ 
    public static final String endpoint= "http://localhost:8080/myClass": 
    /* ...*/ 
} 

然後你就可以訪問使用該行的數據:

MyClass.endpoint 
+0

錯誤,這就是你使用'static'的原因。 'final'既不在這裏,也不在那裏 – Nick

+0

'final'是爲constness。沒有最後的任何人都可以改變價值。 – LoSciamano

+0

這種說法是正確的。然而,你的回答是誤導性的,因爲它意味着'static final'和變量可以在沒有實例化對象的情況下被訪問的事實之間的聯繫。 'final'關鍵字不影響是否可以在不實例化對象的情況下訪問變量,例如,你可以擁有一個非靜態的'final'變量,如果沒有這個類的存在就不能訪問它。 – Nick

1

像你提到的自己,這樣做是爲了創建常量。您創建一個字段來保存具有特定含義的值。這樣你就不必在任何地方聲明該值,而是可以引用靜態。

3

一個變量被定義爲final的那一刻,它可能不應該被稱爲「可變的」,因爲它不再是「變化」 :)

static變量不依賴於的任何特定實例階級 - 它只與階級本身相關聯,而且僅從範圍的角度來看。

所以,你是 - 一個staticfinal變量實際上是一個值不綁定到任何特定類的實例,並不會改變。它是一個常量值,可以從Java代碼中的任何地方引用。

在某些時候,當您決定更改此常量的值時,只需進行一次更改即可將此更改正確傳播到所有其他使用此常量的類。

0

變量應該只有當他們在課堂上的more than one方法或如果程序調用類的方法之間應該save their valuesrequireduse聲明爲fields

例如user.lastName lastName的應該是字段,因爲它是needed期間object lifecycle

static只有當他們需要 not使用在類的一種以上的方法或

變量應聲明如果程序應該not在調用類的方法之間保存它們的值。

例如Math.max(num1,num2)not intristed在NUM1和NUM2 after compleating此操作