3月31號面試,被面試官問到static 和非static 的問題。
首先,了解static關鍵字:在java編程思想里,是這么說的:
通常,創建類的時候,就是在描述這個類的外觀行為,除非用new創建那個類的對象,否則實際上並沒有獲取任何對象,new來創建對象時,數據存儲空間才被分配,其方法才供外界調用。
但是,有兩種情形是上述方法無法解決的。一種情形是,只想為某特定域分配單一存儲空間而不去考慮究竟要創建多少對象,甚至是根本不創建任何對象;另外一種情形是,希望通過某個方法而不與包含他的類的任何對象關聯在一起。也就是收即使沒有創建對象,也能夠調用這個方法。
這樣通過static就能滿足以上的要求。當被聲明為static時,就意味着這個域或者方法不會與包含他的類的任何對象關聯在一起。因此即使沒有創建這個類的對象,也可以調用static方法或者static變量。
另外就是,不論創建多少個類的實例,靜態變量和靜態方法,只會占用一份內存。
因此,當一個方法會被反復調用的時候,我們可以考慮將他申明為static,這樣,不必每次調用的時候,都初始化類實例,分配內存空間。
static變量在java中的初始化順序?
依然引用java編程思想里面的介紹:(不得不說這本書經典啊,基本很多細節都藏在小段里了,沒事拿出來翻翻總沒錯!)
靜態初始化只會在有必要的時候進行。也就是說,如果不需要創建靜態對象所在的類,也不需要以類+"."的形式應用靜態變量或者方法,那么,靜態變量永遠都不會被創建的。
一旦靜態對象被初始化了,那么他們永遠也不會再被初始化,也就是初始化只會執行一次!只會分配一次空間。
初始化的順序:
首先是靜態對象(如果他們尚未因為前面的對象創建過程被初始化),然后是非靜態對象。無法阻止初始化的進行,他在構造器被調用之前就已經發生了。
在類的內部,變量定義的順序決定初始化的順序,變量定義散布於各個地方,仍然會在任何方法(包括構造方法)調用之前被初始化。
在子類繼承父類的時候,初始化的順序如下:
在實例化子類的時候:
1.首先會執行父類的初始化代碼塊(先靜態),實例變量的初始化
2.執行父類的構造函數
3,子類的初始化代碼塊
4,子類的構造函數。
如果類還沒有被加載:那么子類通過類名加點的形式調用對象的時候,首先會執行父類的靜態代碼塊和靜態變量,順序就是他們出現的順序,然后在執行子類的靜態代碼塊和靜態變量。
如果類以及被加載過了,那么靜態的變量和靜態的代碼塊就不會被重復執行,再創建對象的時候只會執行與實例相關的變量初始化和構造函數。
以上為static關鍵字與初始化的相關知識,至於類的加載過程,會在以后的博客中單獨介紹。