2013-02-20 45 views
0

假設我有這個簡單的類:靜態最終屬性的多少副本存儲在內存中時,我有自己的類集合

public class Car { 
    public static final int TYPE_SUV = 1; 
    public static final int TYPE_TRUCK = 2; 
    public String name; 
    public int carType; 
} 

現在,如果我有這些的集合,我知道我我正在爲集合中的每個元素分配一個String和一個int,但我是否還多次存儲靜態的int?這個人爲的示例類是我多年前寫的那種Java的代表,我知道像這樣的神奇數字更好地服務於在單獨的類中定義的enum,但我一直想知道該代碼的副作用是。

回答

5

1.7 JLS

如果字段聲明爲靜態,也不管有多少類的實例(可能爲零),最終可能創建恰好存在一個化身領域。一個靜態字段,有時稱爲類變量,在類被初始化時被體現(§12.4)。

未聲明爲靜態的字段(有時稱爲非靜態字段)稱爲實例變量。只要創建了一個類的新實例(第12.5節),就會爲該類或其任何超類中聲明的每個實例變量創建與該實例關聯的新變量。

要注意的關鍵是,無論您有多少個實例(1個,1000個或者沒有),每個類(非實例)都會消耗內存。

它的價值: 您的namecarType實例變量只在創建實例時分配。更重要的是,在java 7,String之前可以實現一個字符串管理的內存(在PermGen中),在一個被引用的String實例中進行維護。這改變了java 1.7當它被移動到主堆,似乎又在改變(?)與java 8

+0

這是比較合適的答案 – user1428716 2013-02-20 16:49:20

+0

哇,沒有開玩笑。這個答案很有用! – 2013-02-20 16:59:32

+0

+1。感謝您的文章參考。 – dcernahoschi 2013-04-30 11:56:52

3

沒有副本存儲在任何地方,創建了多個對內存中相同位置的引用(在堆上)。

+0

所以懲罰存儲不必要的引用? – 2013-02-20 16:14:26

+0

@JasonSperske存儲引用的懲罰=創建類的懲罰。所以這不是問題 – Arpit 2013-02-20 16:21:38

3

static變量與不與Object相關的類相關。因此,儘可能多的Object你創建,但static變量將一次獲得在內存中的空間和所有的Static context加載類加載時間,所以沒有創建Object也可以訪問您的static變量與class名稱的幫助。

1

沒有維護static的多個副本。所有objects都有samestatic變量。如果他們有它,那麼你必須access他們using object但這不是我們用static做什麼。

存儲引用的懲罰=創建類的懲罰。

相關問題