Java 访问修饰符
Java提供了一些访问修饰符来设置类、变量、方法和构造函数的访问级别。四个访问级别为:
- 对包可见,默认情况下不需要修饰符。
- 仅对类可见(private)。
- 对外界可见(public)。
- 对包和所有子类可见(protected)。
默认访问修饰符 – 没有关键字
默认访问修饰符意味着对于类、字段、方法等我们不明确地声明访问修饰符。
没有任何访问控制修饰符声明的变量或方法可供同一包中的任何其他类访问。接口中的字段隐式为public static final,接口中的方法默认为public。
示例
变量和方法可以不具有任何修饰符声明,如以下示例所示:
String version = "1.5.1";
boolean processOrder() {
return true;
}
私有访问修饰符 – Private
声明为私有的方法、变量和构造函数只能在声明的类内部访问。
私有访问修饰符是最严格的访问级别。类和接口不能是私有的。
声明为私有的变量,如果类中存在公共的getter方法,则可以在类外部访问。
使用私有修饰符是对象封装自身并隐藏数据对外部世界的主要方式。
示例
以下类使用私有访问控制 –
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
在Logger类中,format变量是私有的,所以其他类无法直接获取或设置其值。
因此,为了让外部世界能够访问这个变量,我们定义了两个公共方法: getFormat(),返回format的值,和 setFormat(String),设置其值。
公共访问修饰符 – public
声明为public的类、方法、构造函数、接口等可以从任何其他类中访问。因此,在public类中声明的字段、方法、块可以从属于Java Universe的任何类中访问。
但是,如果我们要访问的public类位于不同的包中,那么依然需要导入这个public类。由于类继承,一个类的所有公共方法和变量都会被它的子类继承。
示例
下面的函数使用了公共访问控制 –
public static void main(String[] arguments) {
// ...
}
应用程序的main()方法必须是公共的。否则,Java解释器(例如java)无法调用它来运行类。
受保护的访问修饰符 – protected
在超类中声明为受保护的变量、方法和构造函数只能被其他包中的子类访问,或被受保护成员类所属包中的任何类访问。
受保护的访问修饰符不能应用于类和接口。方法和字段可以声明为受保护的,但接口中的方法和字段不能声明为受保护的。
受保护的访问权限使子类有机会使用辅助方法或变量,同时防止不相关的类尝试使用它。
示例
以下父类使用受保护的访问权限控制,以允许其子类覆盖openSpeaker()方法。
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// implementation details
}
}
class StreamingAudioPlayer extends AudioPlayer {
boolean openSpeaker(Speaker sp) {
// implementation details
}
}
在这里,如果我们将openSpeaker()方法定义为私有的,则除了AudioPlayer类之外,其他任何类都无法访问它。如果将其定义为公共的,则它将对外界可访问。但我们的意图是只将此方法暴露给其子类,这就是为什么我们使用了受保护的修饰符。
访问控制和继承
强制执行继承方法的以下规则 –
-
在超类中声明为public的方法也必须在所有子类中为public。
-
在超类中声明为protected的方法在子类中必须是protected或public的;不能是private的。
-
在超类中声明为private的方法根本不会被继承,因此对它们没有规则。