天天看點

Java修飾符大彙總

前言

想必大家已經對常用的修飾符有所了解,比如public、protected、private和final等等,已經知道大概是怎麼用的,但是涉及到具體可能就有所搪塞,比如哪些可以修飾類,哪些可以修飾方法,諸如此類,此篇博文的目的就是彙總常見的情況。

分類

Java語言提供了很多修飾符,大概分為兩類:

1. 通路權限修飾符

2. 非通路權限修飾符

通路權限修飾符

  1. public:共有通路。對所有的類都可見。
  2. protected:保護型通路。對同一個包可見,對不同的包的子類可見。
  3. default:預設通路權限。隻對同一個包可見,注意對不同的包的子類不可見。
  4. private:私有通路。隻對同一個類可見,其餘都不見。

總結為表格:

修飾符 同類 同包 子類 其他包
public
protected ×
default × ×
private × × ×

非通路權限修飾符

  1. static 修飾符,用來建立類方法和類變量。
  2. final 修飾符,用來修飾類、方法和變量,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量為常量,是不可修改的。
  3. abstract 修飾符,用來建立抽象類和抽象方法。
  4. synchronized 用于多線程的同步。
  5. volatile 修飾的成員變量在每次被線程通路時,都強制從共享記憶體中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程将變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
  6. transient:序列化的對象包含被 transient 修飾的執行個體變量時,java 虛拟機(JVM)跳過該特定的變量。

外部類修飾符

  • public(通路控制符),将一個類聲明為公共類,它可以被任何對象通路,一個程式的主類必須是公共類。
  • default(通路控制符),類隻對包内可見,包外不可見。
  • abstract(非通路控制符),将一個類聲明為抽象類,抽象類不能用來執行個體化對象,聲明抽象類的唯一目的是為了将來對該類進行擴充,抽象類可以包含抽象方法和非抽象方法。。
  • final(非通路控制符),将一個類生命為最終(即非繼承類),表示它不能被其他類繼承。

注意:

1.protected 和 private 不能修飾外部類,是因為外部類放在包中,隻有兩種可能,包可見和包不可見。

2.final 和 abstract不能同時修飾外部類,因為該類要麼能被繼承要麼不能被繼承,二者隻能選其一。

3.不能用static修飾,因為類加載後才會加載靜态成員變量。是以不能用static修飾類和接口,因為類還沒加載,無法使用static關鍵字。

内部類修飾符

内部類與成員變量地位一直,是以可以public,protected、default和private,同時還可以用static修飾,表示嵌套内部類,不用執行個體化外部類,即可調用。

方法修飾符

  1. public(公共控制符),包外包内都可以調用該方法。
  2. protected(保護通路控制符)指定該方法可以被它的類和子類進行通路。具體細節可參考:http://blog.csdn.net/dawn_after_dark/article/details/74453915
  3. default(預設權限),指定該方法隻對同包可見,對不同包(含不同包的子類)不可見。
  4. private(私有控制符)指定此方法隻能有自己類等方法通路,其他的類不能通路(包括子類),非常嚴格的控制。
  5. final ,指定方法已完備,不能再進行繼承擴充。
  6. static,指定不需要執行個體化就可以激活的一個方法,即在記憶體中隻有一份,通過類名即可調用。
  7. synchronize,同步修飾符,在多個線程中,該修飾符用于在運作前,對它所屬的方法加鎖,以防止其他線程的通路,運作結束後解鎖。
  8. native,本地修飾符。指定此方法的方法體是用其他語言在程式外部編寫的。
  9. abstract ,抽象方法是一種沒有任何實作的方法,該方法的的具體實作由子類提供。抽象方法不能被聲明成 final 和 static。 任何繼承抽象類的子類必須實作父類的所有抽象方法,除非該子類也是抽象類。 如果一個類包含若幹個抽象方法,那麼該類必須聲明為抽象類。抽象類可以不包含抽象方法。 抽象方法的聲明以分号結尾,例如:public abstract sample();。

成員變量修飾符

  • public(公共通路控制符),指定該變量為公共的,它可以被任何對象的方法通路。
  • protected(保護通路控制符)指定該變量可以别被自己的類和子類通路。在子類中可以覆寫此變量。
  • default(預設權限),指定該變量隻對同包可見,對不同包(含不同包的子類)不可見。
  • private(私有通路控制符)指定該變量隻允許自己的類的方法通路,其他任何類(包括子類)中的方法均不能通路。
  • final,最終修飾符,指定此變量的值不能變。
  • static(靜态修飾符)指定變量被所有對象共享,即所有執行個體都可以使用該變量。變量屬于這個類。
  • transient(過度修飾符)指定該變量是系統保留,暫無特别作用的臨時性變量。不持久化。
  • volatile(易失修飾符)指定該變量可以同時被幾個線程控制和修改,保證兩個不同的線程總是看到某個成員變量的同一個值。
final 和 static 經常一起使用來建立常量。

局部變量修飾符

only final is permitted。

為什麼不能賦予權限修飾符?

因為局部變量的生命周期為一個方法的調用期間,是以沒必要為其設定權限通路字段,既然你都能通路到這個方法,是以就沒必要再為其方法内變量賦予通路權限,因為該變量在方法調用期間已經被加載進了虛拟機棧,換句話說就是肯定能被目前線程通路到,是以設定沒意義。

為什麼不能用static修飾

我們都知道靜态變量在方法之前先加載的,是以如果在方法内設定靜态變量,可想而知,方法都沒加載,你能加載成功方法内的靜态變量?

接口

接口修飾符

接口修飾符隻能用public、default和abstract。

不能用final、static修飾。

接口預設修飾為abstract。

接口中方法修飾符

only public & abstract are permitted 。

意思隻能用 public abstract修飾,當然如果你什麼都不寫,預設就是public abstract。

注意:在Java1.8之後,接口允許定義static 靜态方法了!是以也可以用static來修飾!