java中static關鍵字的用法
static是靜態修飾符,在java中,static可以作用在變數、方法、類上,以及還可以在類中獨立成一個靜態塊。被static修飾的,一般都是屬於類本身的,在類載入的過程中,靜態的變數就會被初始化,static靜態塊就會被執行,靜態的方法載入到記憶體,關於靜態的東西會單獨放到一段記憶體中,這樣對於類的多個例項物件來說,訪問靜態的東西,其實訪問的都是同一塊記憶體空間。
靜態變數
按照是否靜態,對成員變數可以分為兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:
對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。
對於例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。
靜態方法
靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。
靜態方法只能訪問靜態成員變數和靜態成員方法,非靜態方法可以訪問非靜態成員方法和非靜態成員變數,也可以訪問靜態成員變數和靜態成員方法。
靜態類
一個普通類是不能宣告為靜態的,只有內部類才可以。內部類被宣告為靜態的,就可以直接像普通類一樣被訪問。
package test; import test.OuterClass.InnerClass; public class Test { public static void main(String[] args) { // OuterClass.InnerClass innerClass = new OuterClass.InnerClass(); InnerClass innerClass = new InnerClass(); innerClass.a(); } } class OuterClass{ static class InnerClass{ public void a(){ System.out.println("OuterClass的內部類InnerClass的方法a"); } } }
靜態塊
static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。
package test;
public class Test {
private static String str;
static{
Test test = new Test();
test.a();
}
static{
str="1";
System.out.println(str);
}
static{
str="2";
System.out.println(str);
}
public void a(){
System.out.println("Test中的a方法");
}
public static void main(String[] args) {
}
}
執行結果:
Test中的a方法
1
2