Java 提供了四个访问修饰符来设置类、变量、方法和构造函数的访问级别,例如:public、private、protected 和 default。
这些访问级别修饰符确定其他类是否可以使用特定字段或者调用特定方法。
访问控制级别
Java 有两个级别的访问控制。
- 类级别 — 允许的修饰符是 public 或者包私有的(默认)。
- 方法级别 — 允许的修饰符是 public、private、protected 或者 package-private(默认)。
可以使用修饰符 public
声明一个类,在这种情况下,该类对任何地方的所有类都是可见的。
如果一个类没有修饰符(default
,也称为包私有),它只在它自己的包中可见。
对于成员,还有两个另外的访问修饰符:private
和 protected
。
private 修饰符指定该成员只能在其自己的类中访问。
protected 修饰符指定该成员只能在它自己的包中访问(如包私有),此外,它的类的子类在另一个包中可以访问。
private 和 protected 都可以(并且经常)应用于嵌套的类和接口,只是永远不会应用于顶级类和接口。
Java访问修饰符
- public - 随处可以访问
- protected - 可以在同一个包和子类中访问
- default - 只能在同一个包中访问
- private - 只能在同一个类中访问
访问修饰符可以严格排序如下:
public > protected > 包的private(或者default)> private
public
public 可以从任何地方访问。
可以从任何其他类访问声明为 public 的类、方法、构造函数、接口等。
但是,如果我们尝试访问的公共类在不同的包中,那么仍然需要导入公共类。
public class HelloWorld { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
在上面的例子中,getFormat()
和 setFormat()
方法是公共的,所以它们可以在任何地方访问。
protected
Protected 可由同一包的类和驻留在任何包中的子类访问。
受保护的访问使子类有机会使用辅助方法或者变量,同时防止不相关的类尝试使用它。
public class HelloWorld { private String format; protected String getFormat() { return this.format; } protected void setFormat(String format) { this.format = format; } }
在上面给出的 HelloWorld
示例中,变量 format
被声明为 protected
,因此它可以被存在于同一个包中的所有类访问,其中存在 HelloWorld.java
,以及存在于其他包中的子类包也是如此。
default(包私有)
默认访问修饰符意味着我们没有为类、字段、方法等显式声明访问修饰符。
默认值可由同一包的类访问。
请注意,接口中的字段隐式为“public static final”,而接口中的方法默认为“public”。
public class HelloWorld { String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
在上面给出的 HelloWorld
示例中,变量 format
被声明为 default
,因此它可以被存在于 HelloWorld.java
的同一个包中的所有类访问。
private
私有访问修饰符是最严格的访问级别。
(最顶层)类和接口不能是私有的。
私有成员只能在同一个类中访问。
声明为私有的方法、变量和构造函数只能在声明的类本身内访问。
在上面给出的 HelloWorld
示例中,变量 format
被声明为私有的,因此没有类可以直接访问它。
它必须通过公共方法 getFormat()
和 setFormat()
访问。
访问级别以两种方式影响我们。
首先,当我们使用来自其他来源的类时,访问级别决定了我们自己的类可以使用这些类的哪些成员。
其次,当你编写一个类时,你需要决定你类中的每个成员变量和每个方法应该具有什么访问级别。
局部变量和形式参数不能采用访问修饰符。
由于根据范围规则,它们本质上是不可访问的,因此它们实际上是私有的。
如果其他程序员使用类,我们希望确保不会发生因误用而导致的错误。
访问级别可以做到这一点。