2014-10-07 88 views
0
class A   // Normal Class 
{ 
    static int i; // Static int variable 
    int j;   // Normal int variable 
} 

假設我創建了兩個對象,即A1,A2
做兩個對象單獨的內存爲變量i或公共,PermGen的空間分配靜態變量內存分配

會是什麼A1A2大小?假設假設int的大小爲2個字節。

+3

它是靜態的。它與班級的實例無關。 – 2014-10-07 08:22:42

+0

每個實例的大小是多少?如果int的大小假定爲2個字節 – Harsha 2014-10-07 08:25:53

+2

爲什麼你會假設int的大小爲2個字節?由於內存對齊問題,'int'屬性至少佔用4個字節,可能還有8個字節。 Java對象也具有顯着的內存開銷,並且一個新的Object()在64位HotSpot上花費24個字節。 – 2014-10-07 08:32:15

回答

6

相同的內存,static成員變量在實例之間共享,因爲staticclass level,它們都是相同的類。

至於對象的大小,他們將size of the object minus the static member variables

此外

  • static有一個小寫的',而不是大寫。關鍵字區分大小寫。
  • int4 bytes,而不是2
+0

我想知道var i的大小,添加到實例大小。對象大小隻能是(size(i)+ size(j))或(size(j))。 bcoz var i被單獨存儲 – Harsha 2014-10-07 09:44:49

+0

'i'沒有被添加到對象大小,它基本上被視爲一個單獨的全局變量,只能被該類訪問。 – 2014-10-07 09:48:13

+1

謝謝.. Ross Drew – Harsha 2014-10-07 12:56:57

3

是否兩個物體已經單獨存儲爲變量i分配?

靜態成員處於類(而非實例)級別。所以,只會有一個int ij處於實例級別,因此A的每個實例都將包含一個j

所以,你的問題是一種無效。爲什麼? 因爲靜態有類的實例無關(像馬爾科Toplonik說)

instanceOfA.i實際上將被解析爲A.i

0

靜態實例,在類模板內部聲明。編譯器只將該類加載到內存一次,並使用此模板編譯器創建字節代碼。 JVM通過使用此類模板創建對象,並且不會加載越來越多的相同類模板來創建越來越多的對象。因此靜態實例只聲明一次。同一類的每個對象都訪問相同的靜態實例。

祝你好運!!!

+1

*編譯器*不執行*加載*類和創建對象的任務。 JVM這樣做 – TheLostMind 2014-10-07 08:28:42

0

靜態變量在加載類時加載,所以它們被分配一個固定的內存空間,而不管創建的對象的數量如何。

因此,對於所有創建的對象,變量i的內存保持不變。

您甚至可以在不創建對象的情況下訪問靜態變量和函數,只需使用類名即可。

class A 
{ 
    static int i; 
} 

A.i=10; 
1

什麼是每個實例

對象的尺寸大小隻取決於實例成員。

如何證明它?

計算A型的物體的大小和檢查什麼是版畫,然後做同樣的,而不在類的靜態變量?

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(new A()); 

System.out.println(baos.size());