通常來講,創建類的時候,就是在描述一個類的外觀與行爲,並且需要創建這個類的實例對象,否則並沒有獲得任何對象,用new來創建對象時,數據的存儲空間纔會被分配,這個類的方法也纔可以被外界調用。。但是有特例嗎?
有兩種情形,第一:在不考慮創建多少對象,甚至根本就不用new創建實例對象的情況下,爲某特定區域分配存儲空間;第二:在不創建這個類的對象的情況下,調用這個類中的方法。
通過static關鍵字可以滿足這兩種情形。static修飾的變量是靜態變量,在系統內存中指定了特定的區域來存放這個變量,因此即便創建多個對象,多個對象也只指向同一個內存空間,多個對象的值是同步變化的(其實是對應同一個值)。
如下代碼示例:
測試static關鍵字,用static修飾一個變量的時候,
1.會在內存中爲某特定域指定單一存儲空間,不去考慮要創建多少對象;
2.希望某個方法不與包含他的那個類的任何對象關聯在一起,也就是說,即使沒有創建對象也能調用這個方法。
使用類名點變量是引用static變量的首選方式
ackage com.company;
/**
* Created by wangyong1015 on 2016/11/8.
*/
/**
* 如下的代碼,static修飾i,StaticTest.i只有一份存儲空間,所以輸出的值是一樣的,是同一個值
*/
//使用類名點變量是引用static變量的首選方式,
public class StaticTest {
static int i = 47;
public static void main(String[] args) {
//兩個方法
//1.通過對象去定位i
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
System.out.println("st1:"+st1.i);
System.out.println("st2:"+st2.i);
//2.通過類名直接引用
System.out.println( "類名直接調用"+StaticTest.i);
StaticTest.i++;
//輸出結果均爲48
System.out.println("st1++:"+st1.i);
System.out.println("st2++:"+st2.i);
//由此可以看出,static修飾後,所有引用都指向同一個位置
st1.i++;
System.out.println(st1.i);//輸出49
System.out.println(st2.i);//輸出49
}
}
}