Java 訪問許可權修飾符public,private,protected和不寫的區別
訪問控制修飾符
Java中,可以使用訪問控制符來保護對類、變數、方法和構造方法的訪問。Java 支援 4 種不同的訪問許可權。
public : 對所有類可見。protected : 對同一包內的類和所有子類可見。子類可以跨包繼承父類的protected 成員和方法。default (即預設,什麼也不寫): 在同一包內可見
private : 在同一類內可見。
我們可以可以通過以下表來說明訪問許可權:修飾符 | 當前類 | 同一包內 | 子孫類 | 其他包 | 其他包子孫類 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N | Y/N(說明) |
default | Y | Y | N | N | N |
private | Y | N | N | N | N |
公有訪問修飾符-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 的方法,不能夠被繼承。