我主要從以下兩個方面來介紹:
一、在一個類中的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();
}
}