標籤:
轉載自:
http://blog.sina.com.cn/s/blog_afddb8ff0101aqs9.html
靜態代碼塊:有些代碼必須在項目啟動的時候就執行,這種代碼是主動執行的(當類被載入時,靜態代碼塊被執行,且只被執行一次,靜態塊常用來執行類屬性的初始化)
靜態方法:需要在項目啟動的時候就初始化,在不建立對象的情況下,這種代碼是被動執行的(靜態方法在類載入的時候 就已經載入 可以用類名直接調用)
兩者的區別就是:靜態代碼塊是自動執行的; 靜態方法是被調用的時候才執行的.
使用類的靜態方法時,注意:
a、在靜態方法裡只能直接調用同類中其他的靜態成員(包括變數和方法),而不能直接存取類中的非靜態成員(這是因為,對於非靜態方法和變數,需要先建立類的執行個體對象後才可使用,而靜態方法在使用前不用建立任何對象)
b、 靜態方法不能以任何方式引用this和super關鍵字,因為靜態方法在使用前不用建立任何執行個體對象,當靜態方法調用時,this所引用的對象根本沒有產生。
c、靜態變數是屬於整個類的變數而不是屬於某個對象的。注意不能把任何方法體內的變數聲明為靜態
java中類載入順序
1、虛擬機器在首次載入Java類時,會對靜態初始化塊、靜態成員變數、靜態方法進行一次初始化 2、只有在調用new方法時才會建立類的執行個體 3、類執行個體建立過程:按照父子繼承關係進行初始化,首先執行父類的初始化塊部分,然後是父類的構造方法;再執行本類繼承的子類的初始化塊,最後是子類的構造方法 4、類執行個體銷毀時候,首先銷毀子類部分,再銷毀父類部分
總結: 對象的初始化順序:首先執行父類靜態內容,父類靜態內容執行完畢後,接著去執行子類的靜態內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態代碼塊,如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態代碼塊內容先執行,接著執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。
注意:子類的構造方法,不管這個構造方法帶不帶參數,預設的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。
java基礎--java靜態代碼塊和靜態方法的區別、static用法