爲什麼java常量聲明爲靜態?爲什麼java常量聲明爲靜態?
class Foo{
static final int FII = 2 ;
}
在這個我明白了最終的使用?爲什麼它必須是靜態的?爲什麼它應該是一個類變量,而不是一個實例變量?
爲什麼java常量聲明爲靜態?爲什麼java常量聲明爲靜態?
class Foo{
static final int FII = 2 ;
}
在這個我明白了最終的使用?爲什麼它必須是靜態的?爲什麼它應該是一個類變量,而不是一個實例變量?
如果它可能因班級的實例而異,那麼它顯然不是常數。對於Math
的每個實例獲得不同的pi值(這不意味着Math
甚至允許構建實例)意味着什麼?或者String
的每個實例的不區分大小寫排序?
它只是讓您可以在沒有該類的實例的情況下訪問它們。
要求創建一個實例來訪問常量字段會浪費資源。
如果一個常量不是靜態的,Java將爲該類的每個對象(即每個對象的常量的一個副本)爲該常量分配一個內存。
如果常量是靜態的,那麼該類的常量只有一個副本(即每個類一個副本)。
因此,如果該常量只有一個值,則應聲明爲靜態。
如果常量可能對每個對象具有不同的值,例如對象的創建時間,則不應將其聲明爲靜態。
非常好的和技術性的答案,非常感謝。 –
爲什麼你想讓不止一個實例擁有自己的'FII'副本? –
我可以聲明'final int FII = 2;'很好。 –
@JonLin:你可以,但你不應該因爲它沒有增加價值,但只會增加內存使用。例外情況是在構造函數調用中初始化常量 - 然後每個實例都可以擁有自己的常量值(在構造函數運行之後是常量),並且可以具有類似'constructionTime'或類似值的值。 –