一直以為內存分配是在調用構造函數的時候。現在發現我錯了。
昨天在看C++的賦值運算時,想做一下筆記。一個類賦值給另一個類時,先調用構造函數,在給成員變量一個個賦值,靜態成員變量不用賦值,因為靜態成員變量屬於類,被類的所有實例共享,所以不用被賦值,方法屬於類,不用被賦值,也賦不了值。
突然想到調用靜態的屬性或方法時不需要調用構造函數,因為調用構造函數只是產生一個新的實例,靜態的屬性或方法屬於類嗎,調用它們根本不用產生實例,我突然想尖叫,不調用構造函數,怎麼分配內存,不分配內存類的屬性存哪裡,連內存都沒有怎麼訪問它。
所以我猜測內存在調用構造函數之前就分配好了,構造函數只是做一些初始化工作。
下面是我的測試:
從圖中我們可以看出,在調用構造函數之前,成員變量已經初始化了,a=1,說明他們已經有屬於他們的內存了,不然a=1,s=1中的1往哪存,你不要告訴我說不需要內存。調用構造函數再對非靜態成員變量進行初始化。在調用靜態方法PrintStatic的過程中的確沒有調用構造函數,大家都知道不需要調用構造函數。靜態方法中只能調用靜態的方法和屬性,而屬性的定義,以及在定義的時候給一個初值,都是在調用構造函數之前,一切都說明屬性在調用構造函數之前已經分配內存了,所以請不要說:內存在調用構造函數的時候分配。
一個類占用的內存是多少?我是這樣認為的:
一個類所占的內存等於=屬性總內存+方法總內存+應用該類的指針所占的內存+同步索引塊的大小。
屬性肯定是占內存的,至於方法,應該也占吧,不知道方法的內存首地址,怎麼訪問它。除了方法所在的內存,其他三個都是必須占內存的,類中可以沒有方法嗎,所以將基本類型賦給object類型(裝箱),會多分配很多內存。
而這些所需的內存編譯器是非常清楚的,所以在調用構造函數之前調用完全可以分配內存。