引子:曾經看見一句話,初學Java你就該知道static可以修飾方法和變量。學Java一年你就該知道靜態內部類。學Java三年你就該知道靜態代碼塊。
1.靜態變量
? Java中static只能修飾成員變量,不能修飾局部變量。靜態變量存儲于JVM內存區的Method Area(方法區)。static常與final一起使用,定義常量。
2.靜態方法
? 靜態方法在類定義的時候已經被裝載和分配,靜態方法可以直接通過類名調用。靜態方法只能調用static修飾的成員變量和方法,靜態方法不持有this引用。
3.靜態內部類
? static修飾類的時候,只能修飾內部類。因為匿名內部類和非靜態內部類隱式的持有外部類的this引用,所以經常在Android中使用來避免內存泄露。單例模式可以通過靜態內部類的方式構造,classloader的機制可以保證初始化instance時只有一個線程,所以也是線程安全的。
4.靜態代碼塊
? 靜態代碼塊是在虛擬機加載類的時候執行的,只執行一次。如果有多個static代碼塊JVM將按照它們在類中出現的先后順序依次執行它們。非靜態代碼塊是在類new一個實例的時候執行,而且是每次new對象實例都會執行。
? ? 靜態代碼塊是主動執行的,靜態方法是被調用的時候才執行的。
5.靜態導入
? 靜態導入是JDK1.5之后的新特性。可以在導包的時候import static導入包也可以直接導入靜態方法。在使用的時候可以直接方法名調用。雖然靜態導包減少了代碼,但是犧牲了代碼的可讀性。使用的時候要慎重。