說說java 中 static 的基礎知識和易混點

我主要從以下兩個方面來介紹:

一、在一個類中的static的用法;

二、在繼承關係中static的用法。

一、在一個類中的static的用法:

衆所周知,static 可以修飾的內容有:成員變量、方法、代碼塊{}、class。下面分別來說:

1.static修飾成員變量,該變量可以通過類名直接訪問,也可以通過靜態方法訪問。

2.static修飾方法,該方法可以通過類名訪問,也可以通過其他靜態方法訪問。

3.static修飾代碼塊,代碼塊中的內容會根據定義的先後順序加載。注意這裏不能定義成員變量,要想訪問方法也只能方法靜態方法。

4.static修飾class一般用於內部類。

   這裏多說兩句,就是內部類的用法。要想定義一個內部類,有兩種方式:利用外部類的對象new出來;直接定義出來。

   static修飾的內部類兩種方式,都可以。只不過用第二種方式的時候,需要import進來響應的內部類。

   非static修飾的內部類,只能通過第一種方式獲取該類的對象。

二、在繼承關係中static的用法(與以上四點對應)。

1.對於變量就不多說了,如果定義了同名變量默認情況下是掉子類的變量,用this.變量名 返回的也是子類的變量值,用super.變量名 返回的就是父類的變量值。

2.對於static方法的繼承,話就多了。static方法是不能被重寫的。我這裏所說的重寫,不是簡單的子類去覆蓋父類的方法,而是指的是多態的重寫。在不寫override的前提下,子類   可以再寫一個和父類相同的static方法,但是不支持多態。變量定義的哪個類型,就會掉哪個類型的方法。這個設計到JVM中多態的運行機制,這個我在後邊的文章中再進行講    解。

3.代碼塊是不能繼承的,但是這裏我想說的是,靜態代碼塊,構造函數,非靜態代碼塊在子父類中的調用順序問題。具體參考下這篇     http://blog.csdn.net/liufangbaishi2014/article/details/52959653 調用順序爲父類靜態代碼段->子類靜態代碼段->父類非靜態代碼段->父類構造方法->子類非靜態代碼段->子類構造方法

4.我直接說下內部類的繼承

   被static修飾的內部類可以直接定義,也可以通過外部類.內部類名來定義,因爲JVM對static修飾的內部類沒有什麼限制。

   被非static修飾的內部類不能直接定義,需要通過外部類.內部類來定義,而且你會發現報錯。請見下圖:

public class Text {	
	 class TextIner{					
	}
}

上邊是內部類的定義,以下是調用:

class TextImpemtNei extends Text.TextIner{		
} 
報錯了。
爲什麼呢?

繼承於內部類的類,要想構造出來必須先加載其父類,但是其父類是依賴於外部類的,換句話說,如果他的外部類不加載,這個內部類是不是加載的。因爲對於JVM的類加載器來說,它並不認識TextIner這個內部類,只有類加載器把其外部類加載進來之後,纔可以加載內部類。那麼如果使在使用這個繼承於內部類的類時,調用了該內部類的外部類的構造方法,不就能使該外部類加載進來了嗎?解決辦法,就是這樣,用下面這種方式繼承非靜態內部類就不會報錯:

class TextImpemtNei extends Text.TextIner{
	 public TextImpemtNei(Text wi) {  
	        wi.super();  
	    } 	
} 



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