在 Java 中,访问权限修饰符用于控制类、方法、变量和构造器的可见性和访问范围。合理使用它们有助于实现封装(Encapsulation),提高代码的安全性和可维护性。以下是 Java 访问权限修饰符的使用规则和注意事项:
一、四种访问权限修饰符
Java 提供四种访问级别,按访问范围从大到小排列:
- public:公共的,对所有类可见。
- protected:受保护的,对同一包内的类及所有子类可见。
- default(包级私有):没有显式修饰符时默认的访问级别,仅对同一包内的类可见。
- private:私有的,仅对本类可见。
二、具体规则与使用场景
1. public
-
规则:可以被任何其他类访问。
-
使用场景:
- 公开的 API 方法或常量(如工具类的方法)。
- 需要被跨包调用的类、方法或变量。
-
示例:
public class MyClass {
public int publicVar;
public void publicMethod() { }
}
2. protected
-
规则:
- 同一包内的类可以访问。
- 不同包的子类可以访问(通过继承)。
-
使用场景:
- 希望子类能够重写或使用,但不希望完全公开的成员。
- 常用于父类的字段或方法,允许子类扩展。
-
示例:
protected void protectedMethod() { }
protected int protectedVar;
3. default(包级私有)
-
规则:没有修饰符,仅同一包内的类可以访问。
-
使用场景:
- 包内共享的辅助方法或字段,但不希望包外访问。
- 内部实现细节,避免外部依赖。
-
示例:
class PackagePrivateClass { } // 默认修饰符
void defaultMethod() { } // 默认修饰符
4. private
-
规则:仅本类内部可见,其他类(包括子类)无法直接访问。
-
使用场景:
- 封装内部状态,避免外部直接修改(通过公共 getter/setter 控制访问)。
- 辅助方法或字段,仅限本类使用。
-
示例:
private int privateVar;
private void privateMethod() { }
三、注意事项
-
类本身的修饰符:
- 顶层类(非内部类)只能使用
public或default(包级私有)。不能使用protected或private(内部类除外)。 - 一个
.java文件中最多只能有一个public类,且文件名必须与 public 类名相同。
- 顶层类(非内部类)只能使用
-
继承中的访问权限:
- 子类重写父类方法时,访问权限不能比父类更严格(可以相同或更宽松)。例如:
- 父类方法为
protected,子类可重写为protected或public,但不能为default或private。
- 父类方法为
- 子类重写父类方法时,访问权限不能比父类更严格(可以相同或更宽松)。例如:
-
接口中的成员:
- 接口中的方法默认为
public abstract(Java 8+),字段默认为public static final。显式使用private或protected会报错(但 Java 9+ 支持接口私有方法)。
- 接口中的方法默认为
-
构造器的访问权限:
- 通过构造器的访问控制可以限制类的实例化。例如:
private构造器常用于单例模式或工具类(防止外部实例化)。protected构造器允许子类调用,但阻止包外直接实例化。
- 通过构造器的访问控制可以限制类的实例化。例如:
-
反射的绕过:
- 通过反射(Reflection)可以绕过访问权限限制(如访问
private成员),但需谨慎使用,可能破坏封装。
- 通过反射(Reflection)可以绕过访问权限限制(如访问
-
模块系统(Java 9+):
- 如果使用了模块(Module),还需要在
module-info.java中通过exports和opens控制包和类的暴露程度,这会进一步影响访问权限。
- 如果使用了模块(Module),还需要在
四、总结表格
| 修饰符 | 本类 | 同一包 | 不同包的子类 | 其他包 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
五、最佳实践
- 优先使用最严格的访问权限:尽量使用
private,仅暴露必要的方法(通过 public/protected)。 - 避免滥用 public:减少全局可见的成员,降低耦合。
- 使用 getter/setter 封装字段:即使需要提供字段访问,也尽量通过方法控制(可添加验证逻辑)。
- 谨慎使用 protected:因为它扩大了包外子类的访问权限,可能导致不必要的依赖。
正确使用访问修饰符是 Java 封装性的核心,能有效提升代码的健壮性和可维护性。
233

被折叠的 条评论
为什么被折叠?



