1. 程式人生 > >Java 訪問許可權修飾符public,private,protected和不寫的區別

Java 訪問許可權修飾符public,private,protected和不寫的區別

訪問控制修飾符

Java中,可以使用訪問控制符來保護對類、變數、方法和構造方法的訪問。Java 支援 4 種不同的訪問許可權。

public : 對所有類可見。protected : 對同一包內的類和所有子類可見。子類可以跨包繼承父類的protected 成員和方法。

default (即預設,什麼也不寫): 在同一包內可見

private : 在同一類內可見。

我們可以可以通過以下表來說明訪問許可權:
修飾符當前類同一包內子孫類其他包其他包子孫類
publicYYYYY
protectedYYYNY/N(說明
defaultYYNNN
privateYNNNN

公有訪問修飾符-public

被宣告為 public 的類、方法、構造方法和介面能被任何其他類訪問。

如果幾個相互訪問的 public 類分佈在不同的包中,則需要匯入相應 public 類所在的包。由於類的繼承性,類所有的公有方法和變數都能被其子類繼承。

以下函式使用了公有訪問控制:

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

Java 程式的 main() 方法必須設定成公有的,否則,Java 直譯器將不能執行該類。

受保護的訪問修飾符-protected

protected 需要從以下兩個點來分析說明:

  • 基類的 protected 成員是包內可見的,被宣告為 protected 的變數、方法和構造器能被同一個包中的任何其他類訪問;並且對子類可見;

  • 子類與基類不在同一包中那麼在子類中,子類例項可以訪問其從基類繼承而來的 protected 方法,而不能訪問基類例項的protected方法。

protected 訪問修飾符不能修飾類和介面,方法和成員變數能夠宣告為 protected,但是介面的成員變數和成員方法不能宣告為 protected。

子類能訪問 protected 修飾符宣告的方法和變數,這樣就能保護不相關的類使用這些方法和變數。

下面的父類使用了 protected 訪問修飾符,子類重寫了父類的 openSpeaker() 方法。

class AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      // 實現細節
   }
}
 
class StreamingAudioPlayer extends AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      // 實現細節
   }
}

如果把 openSpeaker() 方法宣告為 private,那麼除了 AudioPlayer 之外的類將不能訪問該方法。

如果把 openSpeaker() 宣告為 public,那麼所有的類都能夠訪問該方法。

如果我們只想讓該方法對其所在類的子類可見,則將該方法宣告為 protected。

預設訪問修飾符-不使用任何關鍵字

使用預設訪問修飾符宣告的變數和方法,對同一個包內的類是可見的。

私有訪問修飾符-private

私有訪問修飾符是最嚴格的訪問級別,所以被宣告為 private 的方法、變數和構造方法只能被所屬類訪問,並且類和介面不能宣告為 private

宣告為私有訪問型別的變數只能通過類中公共的 getter 方法和setter方法被外部類訪問。

private 訪問修飾符的使用主要用來隱藏類的實現細節和保護類的資料。

下面的類使用了私有訪問修飾符:

public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}

例項中,Logger 類中的 format 變數為私有變數,所以其他類不能直接得到和設定該變數的值。為了使其他類能夠操作該變數,定義了兩個 public 方法:getFormat() (返回 format的值)和 setFormat(String)(設定 format 的值)

訪問控制和繼承

請注意以下方法繼承的規則:

  • 父類中宣告為 public 的方法在子類中也必須為 public。

  • 父類中宣告為 protected 的方法在子類中要麼宣告為 protected,要麼宣告為 public,不能宣告為 private。

  • 父類中宣告為 private 的方法,不能夠被繼承。