Java Access Modifiers(Java Access Modifiers)
Java提供了许多访问修饰符来设置类,变量,方法和构造函数的访问级别。 四个访问级别是 -
- 对包可见,默认。 不需要修饰符。
- 仅对class可见(私人)。
- 对世界可见(公众)。
- 包和所有子类(受保护)可见。
默认访问修饰符 - 无关键字
默认访问修饰符意味着我们没有为类,字段,方法等显式声明访问修饰符。
声明没有任何访问控制修饰符的变量或方法可用于同一包中的任何其他类。 接口中的字段隐式为public static final,接口中的方法默认为public。
例子 (Example)
可以在没有任何修饰符的情况下声明变量和方法,如以下示例所示 -
String version = "1.5.1";
boolean processOrder() {
return true;
}
私人访问修改器 - 私人
声明为private的方法,变量和构造函数只能在声明的类本身中访问。
专用访问修饰符是限制性最强的访问级别。 类和接口不能是私有的。
如果类中存在公共getter方法,则可以在类外部访问声明为private的变量。
使用private修饰符是对象封装自身并隐藏来自外部世界的数据的主要方式。
例子 (Example)
以下类使用私有访问控制 -
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的类,方法,构造函数,接口等。 因此,可以从属于Java Universe的任何类访问在公共类中声明的字段,方法,块。
但是,如果我们尝试访问的公共类位于不同的包中,则仍需要导入公共类。 由于类继承,类的所有公共方法和变量都由其子类继承。
例子 (Example)
以下功能使用公共访问控制 -
public static void main(String[] arguments) {
// ...
}
应用程序的main()方法必须是公共的。 否则,Java解释器(例如java)无法调用它来运行该类。
受保护的访问修饰符 - 受保护
在超类中声明受保护的变量,方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。
受保护的访问修饰符不能应用于类和接口。 方法,字段可以声明为protected,但是接口中的方法和字段不能声明为protected。
受保护的访问权限使子类有机会使用辅助方法或变量,同时防止非相关类尝试使用它。
例子 (Example)
以下父类使用受保护的访问控制,以允许其子类覆盖openSpeaker()方法 -
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// implementation details
}
}
class StreamingAudioPlayer {
boolean openSpeaker(Speaker sp) {
// implementation details
}
}
在这里,如果我们将openSpeaker()方法定义为private,那么它将无法从AudioPlayer以外的任何其他类访问。 如果我们将其定义为公开的,那么它将变得对所有外部世界都可访问。 但我们的目的是仅将此方法暴露给它的子类,这就是我们使用protected modifier的原因。
访问控制和继承
强制执行以下继承方法规则 -
在超类中声明为public的方法也必须在所有子类中都是公共的。
在超类中声明受保护的方法必须在子类中受到保护或公开; 他们不能私下。
声明为private的方法根本不会继承,因此没有规则。