static的一些相關知識

 關鍵字static是一個修飾符,其可以修飾一下幾種:

1,屬性;2,方法;3,語句塊;4,內部類。

static代表的是類相關,static修飾的東西,所有的對象共享(共享同一塊的內存區域)。其修飾的一些東西放在了static池中(堆內存中一塊新的內存區域)。池雖然是堆裏的一塊區域,但是同堆的最大的不同就是:常駐內存,反覆利用。、

常見的池有:數據庫連接池,String常量池,線程池,static池。

static池的作用:

        static的屬性和方法可以用  對象. 這種方式調用,但做好使用 類名. 調用。(用對象. 調用static的屬性,可讀性差,因爲,非static的屬性也可以用對象.的方式調用,這樣我們不容易看出調用的屬性是static的還是非static的。還有就是,類名.調用,不需要創建對象,很明顯能夠節省內存的開銷。)

public class TestStatic {

    static int i1 =1;
	static{ //在類加載的時候執行,先於main方法執行,即類加載是先於main方法的
		System.out.println("static block");
	}
	{  //語句塊,在構造對象時執行,在執行構造前執行
		System.out.println("block");
	}
	public TestStatic(){
		System.out.println("TS");
	}
	public static void main(String[] args) {
		
		System.out.println("begin");
		TestStatic ts;
		System.out.println("end");
		ts = new TestStatic();
	}

}
public class TestS {

	public static void main(String[] args) {
		System.out.println("begin");
		TestStatic ts;
		System.out.println(TestStatic.i1);
		System.out.println("end");
		ts = new TestStatic();
	}

}

static的方法不能訪問非static的屬性。靜態的東西存在比非靜態的東西早,這也就是爲什麼能用不創建對象,卻能用類名.調用的原因。非static的屬性和方法在創建對象的時候才能夠在內存中申請空間,而static的東西在用的時候,可能沒有對象。也就是說,類名.(static屬性或者方法)的時候,內存中可能沒有對象。所以跟對象相關的一些東西都不能在static的部分出現。還有就是static的方法在重寫的時候,必須使用static的方法去覆蓋(即重寫後的方法也必須是static的)。

既然static的修飾的東西(屬性,方法,語句塊,內部類)比創建對象的時候還早,那他們究竟在什麼時候到到內存中呢?可以這樣說,通過上面那段代碼,可以告訴我們,static修飾的東西都是在類加載的時候進入內存中的。虛擬機在加載類的時候,需要遵循一個原則:Just in time。即在用的時候加載。這有使用靜態語句快才能看出來。

語句塊:凡是在類裏邊寫一大括號,在括號裏邊直接寫語句,都算作是語句快。而靜態語句快則是在語句塊前邊加static就可以了。通過上邊的代碼可以告訴我們:

結論1:語句塊在構造對象的時候執行,在執行構造前執行。

結論2:靜態的語句塊,先與main方法執行,即在類加載的時候執行。

結論3:申明一個變量時,類不會被加載(符合類加載的原則Just in time)。

結論4:構造對象的時候,會加載類。

結論5:類名.的時候也會加載類。

發佈了76 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章