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