| java中的類和方法的修飾符Java程式在定義類時,除了使用class關鍵字標識之外,還可以在class之前增加若干類的修飾符來修飾限定所定義的類的特性。類的修飾符分為存取控制符和非存取控制符兩大類。修飾符之間的先後排列次序對類的性質沒有任何影響。
一,非存取修飾詞。
1.抽象類別:
凡是用abstract修飾符修飾的類被稱為抽象類別。抽象類別就是沒有具體對象的概念類。
抽象類別是一種經過最佳化的概念組織方式:把共同特點抽象出來;其後在描述和處理某一種具體對象時,就只需描述不同的特殊之處。這種組織方式使得所有的概念層次分明,簡潔洗鍊,非常符合人們日常的思維習慣。
由於抽象類別是它的所有子類的公用屬性的集合,所以使用抽象類別的一個優點就是可以充分利用這些公用屬性來提高開發和維護程式的效率。
值得一提的是,物件導向技術是要用更接近於人類思維方式的方法來處理實際問題,抽象類別的設立就是這種思想的具體體現之一,它是模仿人類的思維模式的產物。
2.最終類:
如果一個類被final修飾符所修飾和限定,說明這個類不可能有子類。
被定義為final的類通常是一些有固定作用、用來完成某種標準功能的類。如Java系統定義好的用來實現網路功能的InterAddress、Socket等類都是final類。
abstract和final修飾符不能同時修飾一個類,因為abstract類自身沒有具體對象,需要派生出子類後在建立子類的對象;而final類不可能有子類。這樣放在一起修飾就沒有意義了。
3.有些類的修飾符也可以用來修飾類中的域或方法:
(1) 域:是類和對象的靜態屬性,定義域的操作就是說明變數或建立對象的操作。
<1> 靜態域:
用static修飾符修飾的域是僅屬於類的靜態域。靜態域是類中每個對象共用的域。他們是類的域,不屬於任何一個類的具體對象。是一個公用的儲存單元,任何一個類的對象訪問它時,取到的都是相同的數值。
<2> 靜態初始化器:
靜態初始化器是由關鍵字static引導的一對大括弧括起的語句組。作用是:在載入時,初始化類的靜態域。如有多個static{}程式段,則在類的初始化時,會依次執行。
與建構函式相同,他們都是用來完成初始化的工作,但是靜態初始化器與建構函式有三點不同:
①建構函式是對每個新建立的對象初始化,而靜態初始化器是對類自身進行初始化。
②建構函式是在用new運算子產生新對象時由系統自動執行,而靜態初始化器則是在它所屬的類載入到記憶體時由系統調用執行。
③不同於建構函式,靜態初始化器不是方法,沒有方法名、傳回值和參數列表。
<3> 最終域:
用final修飾的域,實際上就是Java中的常量。
用final修飾符說明常量時,需要注意以下幾點:
①需要說明常量的資料類型。
②需要同時指出常量的具體取值。
③因為所有類對象的常量成員,其數值都固定一致,為了節省空間的,常量通常聲明為static.
<4> 易失域:
如果一個域被volatile修飾符所修飾,說明這個域可能同時被幾個線程所控制和修改,即這個域不僅僅被當前程式所掌握,在運行過程中可能在其他未知的程式操作影響和改變該域的取值。在使用當中應該特別注意。
通常,volatile用來修飾接受外部輸入的域。如表示目前時間的變數將系統的後台線程隨時修改,以保證程式中取到的總是最新的當前系統時間,所以可以把它定義為易失域。
(2)方法:是類的動態屬性,標誌了類所具有的功能和操作。小括弧是方法的標誌。
<1> 抽象方法:
修飾符abstract修飾的抽象方法是一種僅有方法頭,而沒有具體的方法體和操作實現的方法。使用抽象方法的目的是使所有的子類,對外都呈現一個相同名字的方法,是一個統一的介面。所有的抽象方法,都必須存在於抽象類別之中。
<2> 靜態方法:
用static修飾符修飾的方法,是屬於整個類的類方法,不用的是對象或執行個體的方法。調用這種方法時,應該使用類名作首碼;這種方法在記憶體中的程式碼片段將隨著類的定義而分配和裝載,不被任何一個對象專有;只能處理屬於整個類的成員變數。
<3> 最終方法:
用final修飾符修飾的類方法。功能和內部語句不能再更改的方法,不能再被繼承。
注意:所有已被private修飾符限定為私人的方法,以及所有包含在final類中的方法,都被預設地認為是final的。
<4> 本地方法:
用native修飾符聲明其他語言書寫方法體並具體實現方法功能的特殊的方法。這裡的其他語言套件括C/C++/FROTRAN/彙編等。由於native的方法的方法體使用其他語言在程式外部寫成,所以所有的native方法都沒有方法體,而用一個分號代替。
<5> 同步方法:
如果synchronized修飾的方法是一個類的方法(即static的方法),那麼在被調用執行前,將把系統類別Class中對應當前類的對象加鎖。如果synchronized修飾的是一個對象的方法(未用static修飾的方法),則這個方法在被調用執行前,將把當前對象加鎖。 Synchronized修飾符主要用於多線程共存的程式中的協調和同步。
二. 存取控制符。
存取控制符是一組限定類、域或方法是否可以被程式裡的其他部分訪問和調用的修飾符。類的存取控制符只有一個public,域和方法的存取控制符有四個,分別是public、private、protected,另外還有一種沒有定義專門的存取控制符的預設情況。
1.公有存取控制符public:
Java的類是通過包的概念來組織的,包是類的一個鬆散的集合。處於同一個包中的類可以不需要任何說明而方便的互相訪問和引用,而對於不同包中的類,則不行。但當一個類被聲明為public時,他就具有了被其他包中的類訪問的可能性,只要這些其他包中的類在程式中使用import語句引入public類,就可以訪問和引用這個類。
類中被設定為public的方法是這個類對外的介面部分,避免了程式的其他部分直接去操作類內的資料,這實際就是資料封裝思想的體現。
每個Java程式的主類都必須是public類,也是基於相同的原因。
用public修飾的類的域稱為公用域。如果公用域屬於公用類,則它能被所有的其他類所引用。public修飾符會造成安全性的資料封裝性下降,所以一般應減少public域的使用。
2.預設存取控制符:
預設存取控制權規定,該類只能被同一個包中的類訪問和引用,而不可以被其他包中的類使用,這種訪問特性又稱為包訪問性。
同樣道理,類內的域或方法如果美育存取控制符來限定,也就具有包訪問性。
簡單說,定義在同一個程式中的所有類屬於一個包。
3.私人存取控制符private :
用private修飾得域或方法只能被該類自身所訪問和修改,而且不能被任何其他類(包括該類的子類)來擷取和引用。private修飾符用來聲明那些類的私人成員,它提供了最高的保護層級。
4.保護存取控制符protected :
用protected修飾的成員變數可以被三種類所引用:該類自身、與它在同一個包中的其它類、在其他包中的該類的子類。使用protected修飾符的主要作用是允許其他包中該類的子類來訪問父類的特定屬性。
5.私人保護存取控制符 private protected :
用private protected修飾的成員變數可以被兩種類訪問和引用,一種是該類本身,一種是該類的所有子類。把同一個包內的非子類排除在可訪問的範圍之外,使得成員變數更專於具有明確繼承關係的類,而不是鬆散地組合在一起的包。
另記:內部類的修飾字還可以是private:即只有外層類的地區可以訪問。 |