分類
Java語言提供了很多修飾符,大概分為兩類:
1.訪問權(quán)限修飾符
2.非訪問權(quán)限修飾符
訪問權(quán)限修飾符
1.public:共有訪問。對所有的類都可見。
2.protected:保護(hù)型訪問。對同一個包可見,對不同的包的子類可見。
3.default:默認(rèn)訪問權(quán)限。只對同一個包可見,注意對不同的包的子類不可見。
4.private:私有訪問。只對同一個類可見,其余都不見。
非訪問權(quán)限修飾符
1.static 修飾符,用來創(chuàng)建類方法和類變量。
2.final 修飾符,用來修飾類、方法和變量。
???? final 修飾的類不能夠被繼承,
???? 修飾的方法不能被繼承類重新定義,
???? 修飾的變量為常量,是不可修改的。
3.abstract 修飾符,用來創(chuàng)建抽象類和抽象方法。
4.synchronized 用于多線程的同步。
5.volatile 修飾的成員變量在每次被線程訪問時,都強(qiáng)制從共享內(nèi)存中重新讀取該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時,會強(qiáng)制線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
6.transient:序列化的對象包含被 transient 修飾的實例變量時,java 虛擬機(jī)(JVM)跳過該特定的變量。
類
外部類修飾符
public(訪問控制符),將一個類聲明為公共類,它可以被任何對象訪問,一個程序的主類必須是公共類。
default(訪問控制符),類只對包內(nèi)可見,包外不可見。
abstract(非訪問控制符),將一個類聲明為抽象類,抽象類不能用來實例化對象,聲明抽象類的唯一目的是為了將來對該類進(jìn)行擴(kuò)充,抽象類可以包含抽象方法和非抽象方法。
final(非訪問控制符),將一個類生命為最終(即非繼承類),表示它不能被其他類繼承。?
注意:
protected和private不能修飾外部類,是因為外部類放在包中,只有兩種可能,包可見和包不可見。
final和abstract不能同時修飾外部類,因為該類要么能被繼承要么不能被繼承,二者只能選其一。
不能用static修飾類,因為類加載后才會加載靜態(tài)成員變量。所以不能用static修飾類和接口,因為類還沒加載,無法使用static關(guān)鍵字。
內(nèi)部類修飾符
??? 內(nèi)部類與成員變量地位一直,所以可以public,protected、default和private,同時還可以用static修飾,表示嵌套內(nèi)部類,不用實例化外部類,即可調(diào)用。
方法修飾符
public(公共控制符),包外包內(nèi)都可以調(diào)用該方法。
protected(保護(hù)訪問控制符)指定該方法可以被它的類和子類進(jìn)行訪問。具體細(xì)節(jié)可參考:http://blog.csdn.net/dawn_after_dark/article/details/74453915
default(默認(rèn)權(quán)限),指定該方法只對同包可見,對不同包(含不同包的子類)不可見。
private(私有控制符)指定此方法只能有自己類等方法訪問,其他的類不能訪問(包括子類),非常嚴(yán)格的控制。
final ,指定方法已完備,不能再進(jìn)行繼承擴(kuò)充。
static,指定不需要實例化就可以激活的一個方法,即在內(nèi)存中只有一份,通過類名即可調(diào)用。
synchronize,同步修飾符,在多個線程中,該修飾符用于在運(yùn)行前,對它所屬的方法加鎖,以防止其他線程的訪問,運(yùn)行結(jié)束后解鎖。
native,本地修飾符。指定此方法的方法體是用其他語言在程序外部編寫的。
abstract ,抽象方法是一種沒有任何實現(xiàn)的方法,該方法的的具體實現(xiàn)由子類提供。抽象方法不能被聲明成 final 和 static。 任何繼承抽象類的子類必須實現(xiàn)父類的所有抽象方法,除非該子類也是抽象類。 如果一個類包含若干個抽象方法,那么該類必須聲明為抽象類。抽象類可以不包含抽象方法。 抽象方法的聲明以分號結(jié)尾,例如:public abstract sample();。
成員變量修飾符
public(公共訪問控制符),指定該變量為公共的,它可以被任何對象的方法訪問。
protected(保護(hù)訪問控制符)指定該變量可以別被自己的類和子類訪問。在子類中可以覆蓋此變量。
default(默認(rèn)權(quán)限),指定該變量只對同包可見,對不同包(含不同包的子類)不可見。
private(私有訪問控制符)指定該變量只允許自己的類的方法訪問,其他任何類(包括子類)中的方法均不能訪問。
final,最終修飾符,指定此變量的值不能變。
static(靜態(tài)修飾符)指定變量被所有對象共享,即所有實例都可以使用該變量。變量屬于這個類。
transient(過度修飾符)指定該變量是系統(tǒng)保留,暫無特別作用的臨時性變量。不持久化。
volatile(易失修飾符)指定該變量可以同時被幾個線程控制和修改,保證兩個不同的線程總是看到某個成員變量的同一個值。
?final 和 static 經(jīng)常一起使用來創(chuàng)建常量。
局部變量修飾符
only final is permitted。
為什么不能賦予權(quán)限修飾符?
因為局部變量的生命周期為一個方法的調(diào)用期間,所以沒必要為其設(shè)置權(quán)限訪問字段,既然你都能訪問到這個方法,所以就沒必要再為其方法內(nèi)變量賦予訪問權(quán)限,因為該變量在方法調(diào)用期間已經(jīng)被加載進(jìn)了虛擬機(jī)棧,換句話說就是肯定能被當(dāng)前線程訪問到,所以設(shè)置沒意義。
為什么不能用static修飾
我們都知道靜態(tài)變量在方法之前先加載的,所以如果在方法內(nèi)設(shè)置靜態(tài)變量,可想而知,方法都沒加載,你能加載成功方法內(nèi)的靜態(tài)變量?
接口
接口修飾符
接口修飾符只能用public、default和abstract。不能用final、static修飾。
接口默認(rèn)修飾為abstract。
接口中方法修飾符:only public & abstract are permitted 。意思只能用 public abstract修飾,當(dāng)然如果你什么都不寫,默認(rèn)就是public abstract。
注意:在Java1.8之后,接口允許定義static靜態(tài)方法了!所以也可以用static來修飾!