Java中的static關鍵字主要用於內存管理。咱們能夠應用static關鍵字在變量、方法、塊和嵌套類中。 static關鍵字屬於類,而不是類的實例。
靜態(static)能夠是:工具
修飾變量性能
被static修飾的變量稱做靜態變量或類變量;沒有被static修飾的變量,稱爲實例變量。靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態變量分配一次內存,在類加載的過程當中完成靜態變量的內存分配(存儲在「方法區」),可用類名直接訪問(方便),固然也能夠經過對象來訪問(可是這是不推薦的)。對於實例變量,每建立一個類的實例,就會爲實例變量分配一次內存,實例變量能夠在內存中有多個拷貝,互不影響(靈活)。優化
靜態成員變量的初始化順序按照定義的順序進行初始化,static不能夠修飾局部變量,即便靜態方法裏面也不能夠有靜態變量,同時也不能引用非靜態方法,由於static修飾的變量或方法是在加載類的同時加載的,此時非靜態的變量、方法等還未被加載,固然就沒法引用了。可是,非靜態方法或類卻能正常引用靜態變量或方法。由於非靜態老是在靜態以後出現的。this
靜態變量並非所在類的某個具體對象全部,而是該類的全部對象所共有的,靜態變量既能被對象調用,也能直接拿類來調用。因此通常在須要實現如下兩個功能時使用靜態變量:在多個對象之間共享時、方便訪問變量時。靜態變量無論是否被transient修飾,均不能被序列化。對象
修飾方法內存
被static修飾的方法稱做靜態方法,因爲靜態方法不依賴於任何對象就能夠進行訪問,所以對於靜態方法來講,是沒有this的,由於它不依附於任何對象,既然都沒有對象,就談不上this了。而且因爲這個特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,由於非靜態成員方法/變量都是必須依賴具體的對象纔可以被調用。可是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,可是在非靜態成員方法中是能夠訪問靜態成員方法/變量的。靜態方法通常用於工具類中,能夠直接拿類名調用工具方法進行使用。內存管理
對於靜態方法須要注意如下幾點:import
修飾類變量
被static修飾的類稱做靜態內部類。通常一個普通類是不容許被聲明爲靜態的,但在內部類中能夠將其聲明爲static的,這時外部類能夠直接調用內部類,由於靜態內部類是在加載外部類的同時加載的,因此並不要實例化外部類就能直接調用靜態內部類。靜態內部類只能訪問外部類的靜態成員,不能直接訪問外部類的實例變量或實例方法。序列化
靜態塊
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,能夠有多個,位置能夠隨便放,它不在任何的方法體內。JVM加載類時會執行這些靜態的代碼塊,若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們(自動執行),每一個代碼塊只會被執行一次,因此說static塊能夠用來優化程序性能。當一個類中既有static{}塊又有static變量的時候,一樣遵循「先定義先執行」的原則。
靜態導包
使用import static語句代替import靜態導入包是JDK1.5中的新特性,能夠導入一個類裏的一切被static修飾的東西,包括變量、常量、方法和內部類。