Java存取修飾符


Java提供了許多存取修飾符來設定類,變數,方法和建構函式的存取級別。 四個存取級別是 -

  • 無關鍵字(不指定修飾符) - 對包可見,不需要修飾符。
  • private - 僅對類內部可見。
  • public - 公開,對外部可見。
  • protected - 對包和所有子類可見。

1. 預設存取修飾符 - 無關鍵字

預設存取修飾是指沒有為類,欄位,方法等顯式宣告存取修飾符。
宣告沒有任何存取控制修飾符的變數或方法可用於同一包中的任何其他類。 介面中的欄位隱式為public static final,介面中的方法預設為public

範例

可以在沒有任何修飾符的情況下宣告變數和方法,如以下範例所示 -

class Order{
    String version = "1.0.1";

    boolean processOrder() {
       return true;
    }
}

2. 私有存取修飾符 - private

宣告為private的方法,變數和建構函式只能在宣告的類本身中存取。專用存取修飾符是限制性最強的存取級別。類和介面不能宣告為:private
如果類中存在公共getter方法,則可以在類中將變數宣告為private。使用private修飾符是物件封裝自身並隱藏來自外部世界的資料的主要方式。

範例
以下類使用private存取控制 -

public class Logger {
   private String format;

   public String getFormat() {
      return this.format;
   }

   public void setFormat(String format) {
      this.format = format;
   }
}

這裡,Logger類的format變數是private,因此其他類無法直接檢索或設定它的值。

因此,為了使這個變數對外界可用,Logger類中定義了兩個公共方法:getFormat()用於返回format的值,setFormat(String)用於設定它的值。

3. 公共存取修飾符 - public

可以從任何其他類存取使用public宣告的類,方法,建構函式,介面等。 因此,可以從屬於Java任何類存取在公共類中宣告的欄位,方法,塊。

但是,如果嘗試存取的公共類位於不同的包中,則仍需要匯入公共類。 由於類繼承,類的所有公共方法和變數都由其子類繼承。

範例

以下方法使用public存取控制 -

public static void main(String[] arguments) {
   // ...
}

應用程式的main()方法必須宣告為public。否則Java直譯器無法呼叫它來執行該類。

4. 受保護的存取修飾符 - protected

在超類中宣告受保護的變數,方法和建構函式只能由其他包中的子類或受保護成員類的包中的任何類存取。
受保護的存取修飾符不能應用於類和介面。 方法,欄位可以宣告為protected,但是介面中的方法和欄位不能宣告為protected。受保護的存取使子類有機會使用輔助方法或變數,同時防止非相關類嘗試使用它。

範例
以下父類別使用protected存取控制,以允許它的子類覆蓋openSpeaker()方法 -

class AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      // 實現詳細程式碼...
   }
}

class StreamingAudioPlayer {
   boolean openSpeaker(Speaker sp) {
      // 實現詳細程式碼...
   }
}

在這裡,如果將openSpeaker()方法定義為private,那麼它將無法從AudioPlayer以外的任何其他類存取。 如果將類定義為public,那麼它將被所有外部世界類存取。 但這裡的目的是僅將此方法暴露給它的子類,所以只使用protected修飾符。

存取控制和繼承

強制執行以下繼承方法規則 -

  • 在超類中宣告為public的方法也必須在所有子類中都是public
  • 在超類中宣告為protected的方法必須在子類中也要宣告為:protectedpublic; 不能宣告為:private
  • 宣告為private的方法根本不能被繼承,因此沒有規則。