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
的方法必須在子類中也要聲明為:protected
或public
; 不能聲明為:private
。 - 聲明為
private
的方法根本不能被繼承,因此沒有規則。