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不能被继承可言,因此对他们来说没有规则。