1. 程式人生 > >修飾符總結

修飾符總結

 

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

1. 訪問許可權修飾符 

2. 非訪問許可權修飾符

訪問許可權修飾符

 

 

  1. public:共有訪問。對所有的類都可見。
  2. protected:保護型訪問。對同一個包可見,對不同的包的子類可見。
  3. default:預設訪問許可權。只對同一個包可見,注意對不同的包的子類不可見。
  4. 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來修飾!