Java中的访问修饰符
1. 概述
在本教程中,我们将讨论 Java 中的访问修饰符,它们用于设置类、变量、方法和构造函数的访问级别。
简单地说,有四种访问修饰符: public、private、protected和default(无关键字)。
在开始之前,让我们注意顶级类只能使用public或default访问修饰符。在会员级别,我们可以使用所有四个。
2. 默认
当我们不明确使用任何关键字时,Java 将为给定的类、方法或属性设置default访问权限。默认访问修饰符也称为package-private,这意味着**所有成员在同一个包中都是可见的,**但不能从其他包访问:
package com.blogdemo.accessmodifiers;
public class SuperPublic {
static void defaultMethod() {
...
}
}
*defaultMethod()*可以在同一个包的另一个类中访问:
package com.blogdemo.accessmodifiers;
public class Public {
public Public() {
SuperPublic.defaultMethod(); // Available in the same package.
}
}
但是,它在其他包中不可用。
3. 公开
如果我们将 public关键字添加到类、方法或属性中,那么我们将使其对全世界可用,即所有包中的所有其他类都可以使用它。这是限制最少的访问修饰符:
package com.blogdemo.accessmodifiers;
public class SuperPublic {
public static void publicMethod() {
...
}
}
*publicMethod()*在另一个包中可用:
package com.blogdemo.accessmodifiers.another;
import com.blogdemo.accessmodifiers.SuperPublic;
public class AnotherPublic {
public AnotherPublic() {
SuperPublic.publicMethod(); // Available everywhere. Let's note different package.
}
}
有关public关键字在应用于类、接口、嵌套的公共类或接口和方法时如何表现的更多详细信息,请参阅文章 。
4. 私人
任何带有private关键字的方法、属性或构造函数都只能从同一个类中访问。这是限制性最强的访问修饰符,也是封装概念的核心。所有数据都将对外界隐藏:
package com.blogdemo.accessmodifiers;
public class SuperPublic {
static private void privateMethod() {
...
}
private void anotherPrivateMethod() {
privateMethod(); // available in the same class only.
}
}
这篇更详细的文章 将展示private关键字在应用于字段、构造函数、方法和内部类时的行为。
5. 受保护
在public和private访问级别之间,有protected的访问修饰符。
如果我们使用protected关键字声明一个方法、属性或构造函数,我们可以从同一个包(与private访问级别一样)访问该成员,此外还可以从其 class 的所有子类访问该成员,即使它们位于其他包中:
package com.blogdemo.accessmodifiers;
public class SuperPublic {
static protected void protectedMethod() {
...
}
}
*protectedMethod()*在子类中可用(与包无关):
package com.blogdemo.accessmodifiers.another;
import com.blogdemo.accessmodifiers.SuperPublic;
public class AnotherSubClass extends SuperPublic {
public AnotherSubClass() {
SuperPublic.protectedMethod(); // Available in subclass. Let's note different package.
}
}
专门的文章 详细介绍了在字段、方法、构造函数、内部类中使用关键字时以及在同一包或不同包中的可访问性。
6. 比较
下表总结了可用的访问修饰符。我们可以看到一个类,不管使用什么访问修饰符,总是可以访问它的成员:
修饰符 | 类 | 包 | 子类 | 外部 |
---|---|---|---|---|
public |
是 | 是 | 是 | 是 |
protected |
是 | 是 | 是 | 否 |
default |
是 | 是 | 否 | 否 |
private |
是 | 否 | 否 | 否 |