由關鍵字static所定義的變量與方法,分別稱為靜態變量和靜態方法,它們又都被稱為靜態成員
1.靜態方法
無需本類的對象也可以調用此方法,調用形式為“類名.方法名”,靜態方法常常為其他類提供一些方法而被定義。但是靜態方法和非靜態方法在定義時有兩個需要注意的點
(1)靜態方法只能訪問靜態數據,而非靜態方法既能訪問靜態數據也能訪問非靜態數據。
(2)靜態方法中只能訪問靜態方法,而非靜態方法既能訪問靜態方法也能訪問非靜態方法。
造成原因:
靜態方法會隨着類的定義而分配和裝載進內存中,而且只被分配了一個內存空間,因此類的實例調是共享這個靜態方法的內存的。也是因此,靜態方法如果引用了非靜態的,它無法從內存中找到非靜態的代碼段。
2.靜態變量
靜態變量與靜態方法類似,由於在類被定義和裝載時,只分配了一塊存儲空間,因此所有此類的實例共享該靜態變量的內存。進而導致只要一個實例中靜態變量發生改變,所有此類的實例所調用的靜態變量都會發生改變。
需要特別注意一點:static定義的變量會優先於任何其他非static變量定義,在static后跟{}並在其中定義變量,那么這些變量會優先static之前的非static變量定義,這種方法稱為顯式的靜態變量初始化,只會在類第一次被裝載的時候初始化一次。
額外點:還有用static定義的類,但是這種類只能是一個內部類(即在其他類的內部定義),但是一旦被定義為靜態類之后,這個類就能類似於一個普通類搬直接被使用,不需要先實例一個外部類。聲明的形式為 外部類名.靜態的內部類名 實例名 = new 外部類名.靜態的內部類名();