Java訪問修飾符
Java 提供了許多訪問修飾符來設置級彆訪問類,變量,方法和構造函數。這四個訪問級彆:
-
可見的包裝。默認值。不需要任何修飾。
-
隻可見類(private).
-
全部可見 (public).
-
包和所有子類可見 (protected).
默認的訪問修飾符 - 無關鍵詞:
默認的訪問修飾符意味著我們冇有顯式聲明的訪問修飾符的類,字段,方法,等等。
冇有任何訪問控製修飾符聲明的變量或方法可用於任何其他類在同一個包。在接口中的字段是隱含 public static final,並在接口中的方法默認情況下公開。
例子:
變量和方法可以冇有修飾被聲明,如下麵的例子:
String version = "1.5.1"; boolean processOrder() { return true; }
私有訪問修飾符 - private:
被聲明為private方法,變量和構造函數隻能在聲明的類本身中進行訪問。
private訪問修飾符是最嚴格的訪問級彆。類和接口不能是私有的。
被聲明為 private 變量可以在類的外部訪問,如果公共的getter方法中存在的類。
使用 private 修飾符是一個對象封裝本身和外部世界隱藏數據的主要方式。
例子:
下麵的類使用 private 訪問控製:
public class Logger { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
在這裡,Logger類的格式變量是私有的,所以冇有辦法在其他課程上直接獲取或設置其值。
因此,為了使這個變量提供給外部世界,我們定義了兩個公共方法:getFormat(),它返回的格式的值,並和setFormat(String),其中設置它的值。
公共訪問修飾符 - public:
類,方法,構造函數,接口等聲明為public可以從任何其他類訪問。因此,字段,方法,一個公共類內部聲明塊可以從任何類屬於Java全局訪問。
但是,如果我們要訪問的公共類是在不同的包,那麼公共類仍然需要導入。
因為類的繼承,類的所有公共方法和變量由它的子類繼承。
例子:
下麵的函數使用public訪問控製:
public static void main(String[] arguments) { // ... }
應用程序的 main() 方法必須是 public。否則,就不能調用其為一個Java解釋器(如Java)來運行這個類。
受保護的訪問修飾符 - protected:
變量,方法和所聲明的超類構造函數的保護隻能通過受保護的成員的類的包內其他包裝或任何類彆的子類進行訪問。
受保護的訪問修飾符不能被應用到類和接口。方法,字段可以聲明為protected,但是,在一個接口中的方法和字段不能被聲明為protected。
受保護的訪問給子類使用的 helper 方法或變量,同時防止非相關類試圖使用它的機會。
例子:
下麵的父類使用受保護訪問控製,允許其子類重寫 openSpeaker() 方法:
class AudioPlayer { protected boolean openSpeaker(Speaker sp) { // implementation details } } class StreamingAudioPlayer { boolean openSpeaker(Speaker sp) { // implementation details } }
在這裡,如果定義 openSpeaker() 方法為 private,那麼它不會從任何其他類 AudioPlayer 其他訪問。如果我們把它定義為 public,那麼這將成為向所有人外麵的世界。但是,我們的內涵是這種方法暴露給它的子類而已,這就是為什麼使用 protected 修飾符。
訪問控製和繼承:
強製執行的繼承方法如下規則:
-
方法聲明為 public 的超類也必須在所有子類是公共的。
-
聲明在超類保護的方法必須要麼被保護的或公共的子類,而不能是私有的。
-
不包括訪問控製(冇有修飾符用於)聲明的方法可以在子類中聲明了私有的。
-
方法聲明為private不能被繼承可言,因此對他們來說冇有規則。