static關鍵字主要兩種作用:第一,為某特定數據類型或對象分配單一的存儲空間,而與創建對象無關。第二,希望某個方法或屬性與類而不是對象關聯在一起,
也就是說,在不創建對象的情況下就可以通過類來直接調用方法或使用類的屬性。具體而言,static在Java語言中主要有四種使用情況:成員變量,成員方法,代碼
及內部類。以下將本別對這4種情況進行介紹。
(1)static成員變量
雖然Java語言中沒有全局的概念,但可以通過static關鍵字來達到全局的效果。Java類提供了兩種類型的變量:用static關鍵字修飾的靜態變量和沒有static
關鍵字的實例變量。靜態變量屬於類,在內存中只有一個副本(所有實例都指向同一個內存地址),只要靜態變量所在的類被加載,這個靜態變量就會被分配空
間,因此,就可以被使用了。對靜態變量的引用有兩種方式,分別為“類.靜態變量”和“對象.靜態變量”。
實例變量屬於對象,只有對象被創建后,實例變量才會被分配空間,才能被使用,它在內存中存在多個副本。只能用“對象.靜態變量”的方式來引用。
靜態變量只有一個,被類擁有,所有的對象都共享這個靜態變量,而實例對象是與具體對象相關的。需要注意與C++語言不同的是,在Java語言中,不能在方法體中
定義static變量。
(2)static成員方法
與變量類似,Java類同時提供了static方法與非static方法。static是類的方法,不需要創建對象就可以被調用,而非static方法是對象的方法,只有對象被創建出
來后才可以被使用。
static方法中不能使用this和super關鍵字,不能調用非static方法,只能訪問所屬類的靜態成員變量和成員方法,因為當static關鍵字被調用時,這個類的對象可能
還沒被創建,即使已經被創建了,也無法確定調用哪個對象的方法。同理,static方法也不能訪問非static類型的變量。
static的一個很重要的用途是實現單例模式。單例模式的特點是該類只能有一個實例,為了實現這個功能,必須隱藏類的構造方法,即把構造方法聲明為private,
外界無法直接創建這個類型的對象,只能通過該類提供的方法來獲取的對象,要達到這樣的目的只能把創建對象的方法聲明為static。程序示例如下:
public class Singleton {
private static Singleton instance = null;
private Singleton(){};
public static Singleton getInstance(){
if (instance==null) {
instance = new Singleton();
}
return instance;
}
}
用public修飾的static變量和方法本質上都是全局的,如果在static變量前用private修飾,則表示這個變量可以在類的靜態代碼或者類的其他靜態成員方法
中使用,但是不能在其他類中通過類名直接引用。
(3)static代碼塊
static代碼塊(靜態代碼塊)在類中是獨立於成員變量和成員函數的代碼塊。它不在任何一個方法體內,JVM在加載類的時候會執行statci代碼塊,如果有
多個static代碼塊,JVM將會按順序來執行。static代碼塊經常會被用來初始化靜態變量。需要注意的是,這些static代碼塊只會被執行一次。
(4)static內部類
static內部類是指被聲明為static的內部類,它可以不依賴於外部類實例對象而被實例化,而通常的內部類需要在外部類實例化后才能實例化。靜態內部類不能
與外部類有相同的名字,不能訪問外部類的普通成員變量,只能訪問外部類中的靜態成員和靜態方法(包括私有類型)。
需要注意的是,只有內部類才能定義為static