原文: https://howtodoinjava.com/oops/java-access-modifiers/

Java 访问修饰符 – 公共,受保护,私有和默认

Java 提供四个访问修饰符来设置类,变量,方法和构造器的访问级别,即公共私有,和默认。 这些访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。

1. Java 访问修饰符

简而言之,让我们快速比较这些访问修饰符。

  1. 公开 – 随处可见
  2. 受保护 – 可在同一包和子类中访问
  3. 默认 – 仅在同一包中可访问
  4. 私有 – 仅可在同一类访问

可以严格按以下顺序将访问说明符排序为

公共>受保护的>包私有(或默认)>私有

1.1 公共

公共可以从任何地方访问。可以从任何其他类访问声明为public的类,方法,构造器,接口等。

但是,如果我们尝试访问的公共类位于不同的包中,则仍然需要导入公共类。

  1. public class HelloWorld
  2. {
  3. private String format;
  4. public String getFormat() {
  5. return this.format;
  6. }
  7. public void setFormat(String format) {
  8. this.format = format;
  9. }
  10. }

在上面的示例中,getFormat()setFormat()方法是公共的,因此可以在任何地方访问它们。

1.2 受保护

受保护的对象可以由同一包的类以及任何包中的子类访问。 受保护的访问使子类有机会使用辅助方法或变量,同时防止了不相关的类尝试使用它。

  1. public class HelloWorld
  2. {
  3. private String format;
  4. protected String getFormat() {
  5. return this.format;
  6. }
  7. protected void setFormat(String format) {
  8. this.format = format;
  9. }
  10. }

在上述HelloWorld的示例中,变量format被声明为protected,因此可以由存在HelloWorld.java的同一包中存在的所有类以及存在于其他包中的子类来访问它。

1.3 默认(包私有)

默认访问修饰符意味着我们没有明确声明类,字段,方法等的访问修饰符。默认可以被同一包的类访问

请注意,接口中的字段隐式为public static final,而接口中的方法默认为public

  1. public class HelloWorld
  2. {
  3. String format;
  4. public String getFormat() {
  5. return this.format;
  6. }
  7. public void setFormat(String format) {
  8. this.format = format;
  9. }
  10. }

在上述HelloWorld的示例中,变量format被声明为default,因此可以由存在HelloWorld.java的同一包中的所有类访问。

1.4 私有

私有访问修饰符是最严格的访问级别。 (最高级)类和接口不能是私有的。 私有成员仅可在同一类中访问。声明为私有的方法,变量和构造器只能在声明的类本身内访问。

在上述HelloWorld的示例中,变量format被声明为私有,因此没有类可以直接访问它。 必须通过公共方法getFormat()setFormat()访问它。

访问级别以两种方式影响您。 首先,当您使用其他来源的类时,访问级别确定您自己的类可以使用那些类的成员。 其次,编写类时,需要确定类中每个成员变量和每个方法应具有的访问级别。

局部变量和形式参数不能使用访问说明符。 由于根据作用域规则,它们本质上是外部无法访问的,因此它们实际上是私有的。

如果其他程序员使用您的类,则要确保不会发生由于滥用而引起的错误。 访问级别可以帮助您做到这一点。

2. 访问控制级别

两个级别的访问控制

  1. 类级别 - 允许的修饰符是public或包私有(默认)。
  2. 方法级别 - 允许的修饰符为publicprivateprotected或包私有(默认)。

可以使用修饰符public声明一个类,在这种情况下,该类对于所有地方的所有类都是可见的。 如果一个类没有修饰符(默认,也称为包私有),则仅在其自己的包中可见。

对于成员,还有两个附加的访问修饰符:privateprotectedprivate修饰符指定只能在其自己的类中访问该成员。

protected修饰符指定成员只能在其自己的包中(与包私有一起)访问,并且只能由其在另一个包中的类的子类访问。

私有的和受保护的都可以(并且经常)应用于嵌套的类和接口,而绝不能应用于顶级类和接口。

学习愉快!

参考: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html