java修飾符彙總

前言

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

分類

Java語言提供了不少修飾符,大概分爲兩類: 
1. 訪問權限修飾符 
2. 非訪問權限修飾符多線程

訪問權限修飾符

  1. public:共有訪問。對全部的類均可見。
  2. protected:保護型訪問。對同一個包可見,對不一樣的包的子類可見。
  3. default:默認訪問權限。只對同一個包可見,注意對不一樣的包的子類不可見。
  4. private:私有訪問。只對同一個類可見,其他都不見。

總結爲表格:.net

修飾符 同類 同包 子類 其餘包
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修飾。blog

接口默認修飾爲abstract。繼承

接口中方法修飾符

only public & abstract are permitted 。 
意思只能用 public abstract修飾,固然若是你什麼都不寫,默認就是public abstract。 
注意:在Java1.8以後,接口容許定義static 靜態方法了!因此也能夠用static來修飾!接口

 

 

轉載自:https://blog.csdn.net/dawn_after_dark/article/details/74527137生命週期

相關文章
相關標籤/搜索