修飾符:
1)final, abstract
2)transient、synchronized、native、strictfp
3)static
首先我們介紹用於方法的修飾符,接著介紹應用於示例變數的修飾符,最後介紹static應用於變數和方法時怎樣工作。
final方法
final關鍵字能防止方法在子類中重寫,它常常用於執行方法的api功能。例如,thread類具有乙個名為isalive()的方法,他檢查執行緒是否仍然為活動的。但是如果擴充套件thread類,確實沒有任何方法能夠正確地實現該方法(乙個原因是它使用本地**) ,因此,設計者將其設計成final類。就像不能子類化string類一樣(因為需要能夠信任string物件的行為),我們也不能重寫核心類庫中的很多方法。「不能重寫」這一限制提供了安全保障,但是仍然應該很小心地使用它。組織子類重寫方法會失去物件導向的很多優點,包括多型實現的可擴充套件性。典型的final方法宣告如下:
擴充套件superclass是合法的,因為該類本身沒有標識為final。但是,不能像下面的**那樣試圖重寫final方法showsample():
上面的**將會發生編譯錯誤。
final變元
方法的變元是方法宣告中出現在兩個圓括號之間的變數宣告。帶多個變元的點典型方法宣告如下所示:
方法的變元實質上與區域性變數相同。在前面的例子中,變數filenumber和recordnumber 都將遵守應用於區域性變數的規則。這意味著它們也可以帶修飾符final:
在這個例子中,將變數recordnumber宣告為final,這當然意味著不能在該方法中修改它。這時,「修改」 是指為該變數重新賦乙個新值。換句話說,final變元必須保持與傳遞給方法是引數鎖具有的值相同。
抽象方法
抽象方法是乙個已經宣告了(宣告成abstract) 但沒有實現的方法。換句話說,該方法沒有包含任何功能**。也就是,它沒有方法體。當要求子類必須提供實現時,可以將方法標識為abstract。例如,如果編寫乙個具有gouphill()方法的抽象類car,你可能希望car的每個子類都必須定義其自己的、專屬於某種車輛型別的gouphill()行為。
注意,抽象方法是以分好而不是波形括號結尾的。在沒有顯示宣告為abstract的類中,哪怕只有乙個抽象方法也是非法的!
請看下面的非法類:
但是,可以使抽象類不帶抽象方法。下面的**能夠編譯:
在上面的例子中,goodmethod()不是抽象方法。有3條不同的線索能讓你判斷出它不是抽象方法:
1. 該方法為標識abstract
2. 方法宣告包含波形括號,而不是以分號結束。換句話說,方法具有方法體。
3. 方法提供了實際的實現**。
任何擴充套件抽象類的都必須實現超累的所有抽象方法,除非子類也是抽象的。規則如下:
抽象類的第乙個具體子類必須實現超類的所有抽象方法。
「具體」 只不意味著它是非抽象的。因此,如果有乙個抽象類擴充套件另乙個抽象類,則該抽象子類不需要為繼承的抽象方法提供實現。但是,遲早有人要建立非抽象子類(也就是可以被例項化的類),該子類必須實現來自繼承樹的所有抽象方法。下面的例子演示了具有兩個抽象類的具體類的繼承樹:
那麼,其中mini類有多少個方法呢?3個。它同時繼承gettype()方法和docarthings() 方法,因為他們是公共的和具體的(非抽象) 。但是,由於父類vehicle中gouphill()抽象的。並且在car中永遠不會被實現(因此他保持是抽象的),所以,這一意味著mini類——作為vehicle下面的第乙個具體類——必須是想gouphill()方法。換句話說,mini類不能將責任(抽象方法實現)推卸給繼承書中的下乙個類。但是類car可以這樣做,因為和vehicle一樣,car也是抽象的。
要注意那些部位超類的抽象方法實現的具體類。下面的**將無法編譯:
類b不能編譯,因為它沒有實現繼承的抽象方法foo()。儘管類b中的foo(int i) 方法好像是超累抽象方法的一種實現,但它只是乙個過載方法(識別符號相同,但變元不同的方法),因此,它沒有完成超類的抽象方法的要求。
乙個方法永遠、永遠、永遠不能同時標誌為abstract和final,或者同時標識為abstract和private。
思考一下:抽象方法必須被實現(這是指意味著要被子類重寫) ,而final方法和private方法永遠本鞥被子類重寫。
可以這樣說,abstract和final修飾符實際上是對立的。private方法不能被子類看到,所以他們也不能被重寫,因此不能將其標識為abstract。
最後,你需要了解abstract修飾符永遠不能與static修飾符組合使用。本屆稍後部分將介紹static方法,但是現在只要記住下面的內容是非法的即可:
它將產生乙個錯誤,你現在應該熟悉它了
SCJP認證 1 7小結(宣告訪問控制)
識別符號 考試目標1.3 宣告規則 考試目標1.1 類訪問修飾符 考試目標1.2 類修飾符 非訪問 考試目標1.2 介面實現 考試目標1.2 實現介面的類本身可以是抽象的。抽象實現類不必實現介面方法 但是第乙個具體子類必須實現 類只能擴充套件乙個類 沒有多重基礎那個 但它能夠實現多個介面。介面可以擴...
7 訪問修飾符與非訪問修飾符
訪問修飾符 訪問級別從高到底 public 公共的被所有的類使用 protected 受保護的 只能在同包下的類或不同包下的子類使用 預設不寫 只能在同包下的類使用 private 私有的被 private 修飾的只能在本類中使用一旦出了該類其他類不能使用 非訪問修飾符 static1.被 stat...
Java訪問修飾符和非訪問修飾符
private public protect default 訪問許可權 注意一下方法的繼承規則 1 父類宣告為public的方法,子類也必須是public 2 父類宣告的proteted的方法,子類可以是protected或public,不能是private 3 父類宣告的private的方法,不...