class A // Normal Class
{
static int i; // Static int variable
int j; // Normal int variable
}
假設我創建了兩個對象,即A1
,A2
。
做兩個對象單獨的內存爲變量i
或公共,PermGen的空間分配靜態變量內存分配
會是什麼A1
,A2
大小?假設假設int
的大小爲2個字節。
class A // Normal Class
{
static int i; // Static int variable
int j; // Normal int variable
}
假設我創建了兩個對象,即A1
,A2
。
做兩個對象單獨的內存爲變量i
或公共,PermGen的空間分配靜態變量內存分配
會是什麼A1
,A2
大小?假設假設int
的大小爲2個字節。
相同的內存,static
成員變量在實例之間共享,因爲static
是class level,它們都是相同的類。
至於對象的大小,他們將size of the object minus the static member variables。
此外
static
有一個小寫的',而不是大寫。關鍵字區分大小寫。int
是4 bytes,而不是2是否兩個物體已經單獨存儲爲變量i分配?
靜態成員處於類(而非實例)級別。所以,只會有一個int i
。 j
處於實例級別,因此A的每個實例都將包含一個j
。
所以,你的問題是一種無效。爲什麼? 因爲靜態有類的實例無關(像馬爾科Toplonik說)
instanceOfA.i
實際上將被解析爲A.i
靜態實例,在類模板內部聲明。編譯器只將該類加載到內存一次,並使用此模板編譯器創建字節代碼。 JVM通過使用此類模板創建對象,並且不會加載越來越多的相同類模板來創建越來越多的對象。因此靜態實例只聲明一次。同一類的每個對象都訪問相同的靜態實例。
祝你好運!!!
*編譯器*不執行*加載*類和創建對象的任務。 JVM這樣做 – TheLostMind 2014-10-07 08:28:42
靜態變量在加載類時加載,所以它們被分配一個固定的內存空間,而不管創建的對象的數量如何。
因此,對於所有創建的對象,變量i
的內存保持不變。
您甚至可以在不創建對象的情況下訪問靜態變量和函數,只需使用類名即可。
class A
{
static int i;
}
A.i=10;
什麼是每個實例
對象的尺寸大小隻取決於實例成員。
如何證明它?
計算A型的物體的大小和檢查什麼是版畫,然後做同樣的,而不在類的靜態變量?
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new A());
System.out.println(baos.size());
它是靜態的。它與班級的實例無關。 – 2014-10-07 08:22:42
每個實例的大小是多少?如果int的大小假定爲2個字節 – Harsha 2014-10-07 08:25:53
爲什麼你會假設int的大小爲2個字節?由於內存對齊問題,'int'屬性至少佔用4個字節,可能還有8個字節。 Java對象也具有顯着的內存開銷,並且一個新的Object()在64位HotSpot上花費24個字節。 – 2014-10-07 08:32:15