Java中靜態(tài)屬性,靜態(tài)方法和靜態(tài)初始化器
static稱為靜態(tài)修飾符,它可以修飾類中的屬性和方法。
1.靜態(tài)屬性
被static修飾的屬性稱為靜態(tài)屬性,這類屬性一個最本質(zhì)的特點(diǎn)是:它們是類的屬性,而不屬于任何一個類的具體對象。換句話說,對于該類的任何一個具體對象而言,靜態(tài)屬性是一個公共的存儲單元,任何一個類的對象訪問它時,取到的都是相同的數(shù)值,同樣任何一個類的對象去修改它時,也都是在對同一個內(nèi)存單元做操作。
靜態(tài)屬性節(jié)省空間;靜態(tài)屬性保持類對象的一致性修改
舉例:總和、基本工資等
2.靜態(tài)方法
static修飾符修飾的屬性是屬于類的公共屬性:與之相仿,用static修飾符修飾的方法,是屬于整個類的類方法;而不用static至少有三重含義:
(1)調(diào)用這個方法時,應(yīng)該使用類名做前綴,而不是某一個具體的對象名;
(2)非static的方法是屬于某個對象的方法,在這個對象創(chuàng)建時對象的方法在內(nèi)存中擁有自己專用的代碼段;而static的方法是屬于整個類的,它在內(nèi)存中的代碼段將隨著類的定義而分配和裝載,不被任何一個對象專有:
(3) 由于static方法是屬于整個類的,所以它不能操縱和處理屬于某個對象的成員變量,而只能處理屬于整個類的成員變量。也即,static方法只能處理static的數(shù)據(jù)。
3.靜態(tài)初始化器
靜態(tài)初始化器是由關(guān)鍵字static引導(dǎo)的一對大括號括起的語句組。它的作用與類的構(gòu)造函數(shù)有些相似,都用來完成初始化的工作,但是靜態(tài)初始化器與構(gòu)造函數(shù)有三點(diǎn)根本的不同:
(1)構(gòu)造函數(shù)是對每個新創(chuàng)建的對象初始化,而靜態(tài)初始化器是對每個類進(jìn)行初始化;
(2)構(gòu)造函數(shù)是在用new運(yùn)算符產(chǎn)生新對象時由系統(tǒng)自動執(zhí)行,而靜態(tài)初始化器則是在它所屬的類加載入內(nèi)存時由系統(tǒng)調(diào)用運(yùn)行的;
(3)不同于構(gòu)造函數(shù),靜態(tài)初始化器不是方法,沒有方法名、返回值和參數(shù)列表。
讓我們考慮如下的問題,所以考慮由系統(tǒng)自動為新雇員對象生成編號變量的值,將Employee類的屬性定義改寫為:
class Employee //定義雇員類
{
private int m_EmpNo; //私有屬性:雇員編號
String m_EmpName; //雇員姓名
char m_EmpGender; //雇員性別
private double m_EmpSalary; //私有屬性:雇員工資
static double m_MinSalary; //靜態(tài)屬性:最低工資
static int m_NextEmpNo; //下一個新雇員的編號
}
構(gòu)造函數(shù)為:
Employee(String name,char sex,double sal) //構(gòu)造函數(shù),完成初始化工作
{
m_EmpNo=m_NextEmpNo++; //新雇員使用了新編號之后,再產(chǎn)生另一個新編號
m_EmpName=new String(name);
m_EmpGender=sex;
if(sal>=m_MinSalary) //工資額不合理時使用最低工資
m_EmpSalary=sal;
else
m_EmpSalary=m_MinSalary;
這里,為實現(xiàn)編號不重復(fù)地自動生成,引入一個類成員m_NextEmpNo,它的值是下一個新創(chuàng)建的雇員對象的編號。每當(dāng)有新對象生成時,系統(tǒng)調(diào)用構(gòu)造函數(shù),將m_NextEmpNo的當(dāng)前值賦給新雇員的編號變量m_EmpNo,然后讓類靜態(tài)屬性m_NextEmpNo自動加一,這樣新對象的編號就不會與已有對象的編號相重復(fù)。表面看來整個問題似已解決,但實際上還有很關(guān)鍵的一步?jīng)]有完成:那就是static的類屬性m_NextEmpNo的初始化問題。
總之,靜態(tài)初始化器的作用是對整個類完成初始化操作,包括給static類成員賦初值等,它在系統(tǒng)向內(nèi)存加載時自動完成。sat答案