static關鍵字主要有兩種作用:
第一蝠检,為某特定數(shù)據(jù)類型或對象分配單一的存儲空間,而與創(chuàng)建的對象的個數(shù)無關涎显。
第二坤检,實現(xiàn)某個方法或屬性與類而不是對象關聯(lián)在一起,也就是說期吓,在不創(chuàng)建對象的情況下就可以通過類來直接調用方法或使用類的屬性早歇。
在java語言中,static主要有4種使用情況:成員變量讨勤、成員方法箭跳、代碼塊和內部類。
static成員變量
java類提供了兩種類型的變量:用static關鍵字修飾的靜態(tài)變量和不用static關鍵字修飾的實例變量悬襟。
靜態(tài)變量屬于類衅码,在內存中只有一個復制(所有實例都指向同一個內存地址),只要靜態(tài)變量所在的類被加載脊岳,這個靜態(tài)變量就會被分配空間逝段,因此就可以被使用了。
對靜態(tài)變量的引用有兩種方式割捅,分別為“類.靜態(tài)變量”和“對象.靜態(tài)變量”奶躯。
而實例變量屬于對象,只有對象被創(chuàng)建后亿驾,實例變量才會被分配空間嘹黔,才能被使用,它在內存中存在多個復制。只能用“對象.實例變量”的方式來引用儡蔓。
static成員方法
static方法是類的方法郭蕉,不需要創(chuàng)建對象就可以被調用,而非static方法是對象的方法喂江,只有對象被創(chuàng)建出來后才可以被使用召锈。
static方法中不能使用this和super關鍵字,不能調用非static方法获询,只能訪問所屬類的靜態(tài)成員變量和成員方法涨岁。因為當static方法被調用時,這個類的對象可能還沒被創(chuàng)建吉嚣,即使已經被創(chuàng)建了梢薪,也無法確定調用哪個對象的方法。同理尝哆,static方法也不能訪問非static類型的變量秉撇。
static代碼塊
static代碼塊(靜態(tài)代碼塊)在類中是獨立于成員變量和成員函數(shù)的代碼塊的。它不再任何一個方法體內秋泄,JVM在加載類時會執(zhí)行static代碼塊畜疾,如果有多個static代碼塊,JVM將會按順序來執(zhí)行印衔。static代碼塊指揮被執(zhí)行依次啡捶。
static內部類
static內部類是指被聲明為static的內部類,它可以不依賴于外部類實例對象而被實例化奸焙,而通常的內部類需要在外部類實例化后才能實例化瞎暑。靜態(tài)外部類不能與外部類有相同的名字,不能訪問外部類的普通成員變量与帆,只能訪問外部類中的靜態(tài)成員和靜態(tài)方法了赌。