java筆記 static關鍵字詳解

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

static關鍵字

作       用:修飾符,用於修飾成員對象(成員函數、成員變量)代碼塊。切記:不可修飾局部對象(因爲其優先級較高)

存放區域:被static修飾的對象,位於共享區內,而非堆內存中。

執行順序:被static修飾的對象,隨着類的加載而加載,且優先於主函數。

生命週期:和類一樣,只要類還存在就一直駐留在內存當中。

用       法:1.修飾成員變量時,成員變量中儲存的數據應爲對象共有數據。

                          例如:人的性別,所有人都是男或女,所以我們沒有必要每創建一個人的對象就在堆內存中存放人對象的內存塊中再劃分出一塊內存來盛放相同的數據。

                   2.修飾成員函數時,因其執行順序,故成員函數中不能訪問非靜態內容,當然就不能訪問本類中的其他非靜態對象了。

                          例如:工具類中的方法,我們只需要使用其方法,而不需要使用其類中的成員對象,就可把工具類函數定義爲靜態函數。

                   3.修飾代碼塊時,隨着類的加載而加載,且只執行一次。

優  缺  點:根據以上特點可以看出。

    優點:可以修飾對象共有的數據以節省內存空間,修飾工具函數,使其可直接通過類名打點的方式調用,免去創建無用對象。

    缺點:生命週期太長,使用不當容易造成在內存中駐留,不釋放內存。且被其修飾的對象中不能包括非靜態對象。

綜合實例:

class Person {	
	String name;//不使用靜態是因爲每個人的名字不都是相同的。
	static String country="China";//中國人使用本程序時,國籍均爲中國,若都存放在堆內存中會造成內存的浪費。
	
	public static void show(){		
		//System.out.println("name:"+name);
		//上述語句在編譯時會引起錯誤,因爲本方法在類加載的過程中就以完成加載,而此時name變量還未加載到內存中,故此時訪問會造成異常
		System.out.println("My country is:"+country);//此語句編譯時不會出現問題,因爲country變量時靜態變量,根據代碼的執行順序,其已被加載
	}
    
	/*
	 *以下爲Person類的靜態代碼塊
	*/
	static
	{
		System.out.println("I am the Person static blocks");
	}

	/*
	 *以下爲構造代碼塊 ,作用是初始化構造
	 */
	{
		System.out.println("At this point name is:"+name);//構造代碼塊優先於構造函數執行,但並非隨着類的加載而加載,故此處可以訪問非靜態變量
	}

	public Person(String name){		
		System.out.println("My name is:"+name);
	}
}
class StaticDemo{	
	/*
	 *以下爲StaticDemo類的靜態代碼塊
	*/
	static
	{
		System.out.println("I am the StaticDemo static blocks");
	}
	public static void main(String[] args) {
		Person.show();
		Person p = new Person("si Li");
	}
	
}

運行結果爲:

I am the StaticDemo static blocks
I am the Person static blocks
My country is:China
At this point name is:null
My name is:si Li

程序執行分析:

1.首先jvm加載StaticDemo類,故此時StaticDemo類中的靜態代碼塊被加載,打印出第一句話。

2.接着執行main函數,main函數中,第一條執行語句是Person.show(),調用了Person類中的靜態方法,此時jvm首先加載Person類,故Person類中的靜態代碼塊先被加載,故打印出第二句話。

3.緊接着執行Person類中的靜態show()方法,故打印出第三句話。注意:此時構造代碼塊並未執行,因爲其優先級低於靜態函數。

4.這時執行main函數中的第二條語句,創建一個帶有name的Person對象,因構造代碼塊執行在且僅在構造函數之前,故此時先執行構造代碼塊,故此時打印出第4句話,因爲構造函數還未執行,故name值爲null。

5.構造函數執行,故打印出第五句話。

 

總結:static執行的優先級較高但生命週期過長,故有利有弊,應在合適的應用場景下使用,以提高代碼的執行效率。

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