访问修饰符
访问控制修饰符
default ( 即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。private : 在同一类内可见。使用对象:变量、方法注意:不能修饰类(外部类)public : 对所有类可见。使用对象:类、接口、变量、方法protected : 对同一包内的类和所有子类可见。使用对象:变量、方法注意:不能修饰类(外部类) 。
我们可以通过以下表来说明访问权限:
域描述符 | public | protected | default | private |
---|---|---|---|---|
同一个类 | √ | √ | √ | √ |
同一个包 | √ | √ | √ | |
子类 | √ | √ | √ | |
不同包 | √ |
默认访问修饰符
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为
如下例所示,变量和方法的声明可以不使用任何修饰符。
String version = "1.5.1";
boolean processOrder() {
return true;
}
私有访问修饰符-private
私有访问修饰符是最严格的访问级别,所以被声明为
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
实例中,
公有访问修饰符-public
被声明为
以下函数使用了公有访问控制:
public static void main(String[] arguments) {
// ...
}
受保护的访问修饰符-protected
- 子类与基类在同一包中:被声明为
protected 的变量、方法和构造器能被同一个包中的任何其他类访问; - 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的
protected 方法,而不能访问基类实例的protected 方法。
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
class StreamingAudioPlayer extends AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
- 如果把
openSpeaker() 方法声明为private ,那么除了AudioPlayer 之外的类将不能访问该方法。 - 如果把
openSpeaker() 声明为public ,那么所有的类都能够访问该方法。 - 如果我们只想让该方法对其所在类的子类可见,则将该方法声明为
protected 。
访问控制和继承
请注意以下方法继承的规则:
- 父类中声明为
public 的方法在子类中也必须为public 。 - 父类中声明为
protected 的方法在子类中要么声明为protected ,要么声明为public ,不能声明为private 。 - 父类中声明为
private 的方法,不能够被继承。