(1) 靜態變數是屬於class,但不是物件(Object)。
所以要使用靜態變數時,在static method內可以不需要創建任何物件(Object)就可以使用。
例子1:
public class StaticTest {
static int a = 1;
int b = 2;
public static void main(String[] args) {
System.out.println("static variable a= " + StaticTest.a);
StaticTest obj = new StaticTest(); //創建一個class物件(Object)
System.out.println("instance variable b= " + obj.b);
}
}
如果要在static method內調用非靜態變數,就必須創建一個class物件(Object),然後透過物件來調用非靜態變數。
(2) 靜態變數與非靜態變數的差別在於它們對記憶體分配,每個靜態變數只有佔用一個記憶體,
假如你有不同物件都使用同一個靜態變數,它們將會只得到同一個值,而其中一個物件修改靜態變數的值,也會影響到其他物件的靜態變數的值。
例子2:
public class StaticTest2 {
static int a;
int b;
public static void main(String[] args) {
StaticTest2 obj1 = new StaticTest2();
obj1.a = 100;
obj1.b = 101;
System.out.println("obj1.a=" + obj1.a + ", obj1.b=" + obj1.b);
StaticTest2 obj2 = new StaticTest2();
System.out.println("obj2.a=" + obj2.a + ", obj2.b=" + obj2.b);
}
}
靜態變數a的值,通過 obj1或者obj2都只會指向同一個記憶體,換句話說,通過 obj1修改靜態變數a會影響到obj2.a的值。
通過 obj2修改靜態變數a會影響到obj1.a的值。
例項變數(instance variable) b,通過 obj1或者obj2都不會指向同一個記憶體,因為它是依賴物件而創建新的記憶體,所以obj1.b和obj2.b不是同一樣東西,它們是分別獨立存在。
通過 obj1修改靜態變數b,是不會影響到obj2.b的值。
通過 obj2修改靜態變數b,也不會影響到obj1.b的值。