首先用一个例子开始我们今天的介绍。
定义一个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修饰的变量等,在编译时就为这些变量分配了空间。