2011-11-11 49 views
21

爲什麼java常量聲明爲靜態?爲什麼java常量聲明爲靜態?

class Foo{ 
    static final int FII = 2 ; 
} 

在這個我明白了最終的使用?爲什麼它必須是靜態的?爲什麼它應該是一個類變量,而不是一個實例變量?

+8

爲什麼你想讓不止一個實例擁有自己的'FII'副本? –

+1

我可以聲明'final int FII = 2;'很好。 –

+0

@JonLin:你可以,但你不應該因爲它沒有增加價值,但只會增加內存使用。例外情況是在構造函數調用中初始化常量 - 然後每個實例都可以擁有自己的常量值(在構造函數運行之後是常量),並且可以具有類似'constructionTime'或類似值的值。 –

回答

26

如果它可能因班級的實例而異,那麼它顯然不是常數。對於Math的每個實例獲得不同的pi值(這不意味着Math甚至允許構建實例)意味着什麼?或者String的每個實例的不區分大小寫排序?

12

它只是讓您可以在沒有該類的實例的情況下訪問它們。

要求創建一個實例來訪問常量字段會浪費資源。

76

如果一個常量不是靜態的,Java將爲該類的每個對象(即每個對象的常量的一個副本)爲該常量分配一個內存。

如果常量是靜態的,那麼該類的常量只有一個副本(即每個類一個副本)。

因此,如果該常量只有一個值,則應聲明爲靜態。

如果常量可能對每個對象具有不同的值,例如對象的創建時間,則不應將其聲明爲靜態。

+4

非常好的和技術性的答案,非常感謝。 –

相關問題