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