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