一、開篇
首先用一個例子開始我們今天的介紹。
定義一個TestStaticClass類如下:
public class TestStaticClass {
private static int a;
private int b = 0;
public TestStaticClass() {
a++;
b++;
}
public static void testRun() {
System.out.println("run TestStaticClass.testRun");
}
public String toString() {
return "a = " + a + ", b = " + b;
}
}
定義MainClass類如下:
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new TestStaticClass());
System.out.println(new TestStaticClass());
}
}
運行的結果如下:
a = 1, b = 1
a = 2, b = 1
為什麼會這樣呢?這就是Static的作用之一,如果使用static來修飾一個變量,那麼該變量就屬於該類所有,而不再屬於該類的某一實例,被類的所有實例共享。因為Java在加載該類的時候為static變量在內存中分配了一個固定的內存空間來存儲,只要TestStaticClass類存在,那麼該變量a所代表的地址空間就不會消失。
在上面的實例中,每一次新建一個TestStaticClass類,都會修改a所在的地址空間的內容,所以就會導致了a和b的值不一致的情況。
除了在實例中用Static來修飾變量外,還可以用來修飾修飾函數和代碼塊。這些在本文中都會詳細的介紹,但是在這之前,必須記得Static的特性:固定。這個不僅僅指固定的地址,還包括固定的大小。使用static修飾的變量等,在編譯時就為這些變量分配了空間。