Static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,被static修飾的成員變量和成員方法獨立於該類的任何對象。
也就是說,它不依賴類特定的實例,被類的所有實例共享。只要該類加載,JVM虛擬機就能根據類名在運行時數據區的方法區內找到他們。因此,static對象可以在它的任
何對象創建之前訪問,無需引用任何對象。
1、static修飾類的成員方法或者成員變量,我們通常稱該方法是靜態方法,該方法是靜態變量;
若用public修飾static成員方法或者成員變量,表示該方法或該變量是全局的,可以在其他類中通過類名直接調用;
若用private修飾static成員變量,表示該變量只能在該類的成員方法中使用,並且可以在該類的靜態代碼塊中使用;
在靜態方法或者靜態代碼塊中只能調用靜態變量,但在非靜態方法或者代碼塊中可以調用靜態和非靜態的變量。
2、靜態代碼塊 非靜態代碼塊 構造函數的加載順序
靜態代碼塊,在虛擬機加載類的時候就會加載執行,而且只執行一次
非靜態代碼塊,在創建對象的時候(即new一個對象的時候)執行,每次創建對象都會執行一次
1 public class StaticTest { 2 static { 3 System.out.println("static function..."); 4 } 5 { 6 System.out.println("unstatic function..."); 7 } 8 public StaticTest(){ 9 System.out.println("construct function..."); 10 } 11 public static void main(String[] args) { 12 new StaticTest(); 13 } 14 }
運行結果:
所以這三者的加載順序是 靜態代碼塊>非靜態代碼塊>類構造函數
注:非靜態代碼塊在不new類的時候是不是執行的。
如果有多個靜態代碼塊,執行順序是按照代碼塊的先后順序執行。
2、靜態變量
public class StaticTest { static String a="string-a"; static String b; String c = "string-c"; String d; static{ System.out.println("----------------------------"); } static { System.out.println("static function..."); privateStaicString("befor static"); b="string-b"; privateStaicString("after static"); } { System.out.println("unstatic function..."); privateStaicString("befor unstatic"); b="string-b"; privateStaicString("after unstatic"); } public StaticTest(){ System.out.println("construct function..."); privateConstructtring("befor construct"); d="string-d"; privateConstructtring("after construct"); } public static void privateStaicString(String title) { System.out.println("---------" + title + "---------"); System.out.println("a="+a); System.out.println("b="+b); } public void privateConstructtring(String title) { System.out.println("---------" + title + "---------"); System.out.println("a="+a); System.out.println("b="+b); System.out.println("c="+c); System.out.println("d="+d); } public static void main(String[] args) { new StaticTest(); } }
運行結果:
3、static和final一塊使用
static final用來修飾成員變量和成員方法,可簡單理解為“全局常量”!
(1)對於變量,表示一旦給值就不可修改,並且通過類名可以訪問
(2)對於方法,表示不可覆蓋,並且可以通過類名直接訪問。