Static 靜態(tài):這里主要記錄的是靜態(tài)程序塊和靜態(tài)方法
如果有些代碼必須在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行,就需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的;需要在項(xiàng)目啟動(dòng)的時(shí)候就初始化但是不執(zhí)行,在不創(chuàng)建對(duì)象的情況下,可以供其他程序調(diào)用,而在調(diào)用的時(shí)候才執(zhí)行,這需要使用靜態(tài)方法,這種代碼是被動(dòng)執(zhí)行的. 靜態(tài)方法在類(lèi)加載的時(shí)候 就已經(jīng)加載 可以用類(lèi)名直接調(diào)用。
靜態(tài)代碼塊和靜態(tài)方法的區(qū)別是:
靜態(tài)代碼塊是自動(dòng)執(zhí)行的;
靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的.
靜態(tài)方法:如果我們?cè)诔绦蚓帉?xiě)的時(shí)候需要一個(gè)不實(shí)例化對(duì)象就可以調(diào)用的方法,我們就可以使用靜態(tài)方法,具體實(shí)現(xiàn)是在方法前面加上static,如下:
public static void method(){}
在使用靜態(tài)方法的時(shí)候需要注意一下幾個(gè)方面:
在靜態(tài)方法里只能直接調(diào)用同類(lèi)中其他的靜態(tài)成員(包括變量和方法),而不能直接訪問(wèn)類(lèi)中的非靜態(tài)成員。這是因?yàn)椋瑢?duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類(lèi)的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。(備注:靜態(tài)變量是屬于整個(gè)類(lèi)的變量而不是屬于某個(gè)對(duì)象的)
靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法調(diào)用時(shí),this所引用的對(duì)象根本沒(méi)有產(chǎn)生。
靜態(tài)程序塊:當(dāng)一個(gè)類(lèi)需要在被載入時(shí)就執(zhí)行一段程序,這樣可以使用靜態(tài)程序塊。
public class DemoClass {
private DemoClass(){}
public static DemoClass _instance;
static{
if(null == _instance ){
_instance = new DemoClass();
}
}
public static DemoClass getInstance(){
return _instance;
}
}
這樣的程序在類(lèi)被加載的時(shí)候就執(zhí)行了static中的代碼。
Ps:java中類(lèi)的裝載步驟:
在Java中,類(lèi)裝載器把一個(gè)類(lèi)裝入Java虛擬機(jī)中,要經(jīng)過(guò)三個(gè)步驟來(lái)完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗(yàn)、準(zhǔn)備和解析三步,除了解析外,其它步驟是嚴(yán)格按照順序完成的,各個(gè)步驟的主要工作如下:
所謂裝載就是尋找一個(gè)類(lèi)或是一個(gè)接口的二進(jìn)制形式并用該二進(jìn)制形式來(lái)構(gòu)造代表這個(gè)類(lèi)或是這個(gè)接口的class對(duì)象的過(guò)程。其中類(lèi)或接口的名稱(chēng)是給定了的。
裝載:查找和導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù);
鏈接:執(zhí)行下面的校驗(yàn)、準(zhǔn)備和解析步驟,其中解析步驟是可以選擇的;
校驗(yàn):檢查導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù)的正確性;
準(zhǔn)備:給類(lèi)的靜態(tài)變量分配并初始化存儲(chǔ)空間;
解析:將符號(hào)引用轉(zhuǎn)成直接引用;
初始化:激活類(lèi)的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊
本篇文章來(lái)源于 Linux公社網(wǎng)站(www.linuxidc.com) 原文鏈接:http://www.linuxidc.com/Linux/2010-03/24783.htm