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)對於方法,表示不可覆蓋,並且可以通過類名直接訪問。