static關鍵字(java)

本文轉載自:xiaolu602的博客  http://blog.sina.com.cn/xiaolu602
網上關於java static關鍵字的文章很多,但是很多都篇幅很長,對新手來說,理解困難。本人也是新手,看了這篇文章,覺得言簡意賅,很不錯,所以轉載來標記之,作爲分享。

static關鍵字標記的屬性或方法由整個類共享,如果訪問控制權限允許,可以不必創建對象,直接用類加“.”調用。因此static成員也成爲“類成員”或“靜態成員”,如"類屬性"、"類方法"、"靜態方法"等。

  理解static成員的關鍵點在於:它只有一個拷貝存在,是與類相關聯的,不是與類的實例相關聯。說到這裏不得不說一下程序內存的分配問題了,在程序中, 內存總共分爲四個區,分別爲:棧內存區,堆內存區,全局代碼區,全局變量區。其中,棧內存區中存放的是變量名稱,實際上就是對於堆內存中內容的引用地址; 堆內存中存放的是屬性;全局代碼區存放的是整個程序中的方法;全局變量去存放的就是所有的static屬性。

  另一個問題是:爲什麼要使用static關鍵字來定義一些由整個類共享的屬性或方法呢?這是因爲,有些屬性或方法是爲所有類的實例所共有的,如果聲明爲實例屬性或實例方法,就相當於每個實例都會有一份相同的屬性或方法,這不但照成了代碼的冗餘,更爲以後的維護照成了麻煩。

  這裏要注意一個問題,就是在使用static成員的時候有一定的限制:static方法只能使用static的靜態屬性,只能調用static的靜態方 法,不能使用非靜態屬性,不能調用非靜態方法。這就解釋了爲什麼在主方法(main)中如果想直接調用一個方法,只能將該方法定義成static的靜態方 法了。因爲主方法(main)就是一個靜態方法。

  那麼爲什麼要有這麼一個限制呢?因爲static屬性或方法是爲類所調用的,也就是說在類的實例沒有生成以前就可以調用這些成員,而非靜態成員必須在類的 實例生成之後才能由這些實例來使用,所以在static方法中不能使用非靜態成員,但是在非靜態的方法中可以使用靜態的屬性或方法。

  說到這裏又涉及到另外的一個問題了,大家都知道,實例屬性都是在對象生成的時候,調用構造函數的時候初始化的,那麼static的靜態屬性是在什麼時候初 始化的呢?因爲即使沒有一個實例生成,這些靜態的成員也是和類相關聯的,所以需要在調用構造函數之前初始化這些成員。java爲了保證這一點,爲程序設定 了一個類初始化方法,這些靜態的屬性就是在這個類初始化方法的主體部分得到初始化的。java語言保證這個類初始化方法在第一次使用這個類(通常是第一次 加載這個類)的時候調用一次。因爲這個類初始化方法是內部方法,所以對java程序員是不可見的。

  最後分析一下主方法吧:public static void main(String[] args)

public:表示最大的訪問權限

static:因爲執行的執行的就是類的名稱,表明這個方法可以由類直接調用,因此爲一個靜態的方法;

void:因爲主方法是程序的入口,是一切的開始,因此不會有返回值;

main:系統內建的方法名稱

String[] args:用來接收參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章