JAVA中的权限修饰符
在 Java 中,权限修饰符(Access Modifiers) 用于设置类(Class)、变量(Variable)、方法(Method)和构造器(Constructor)的访问级别,它们是 Java 封装(Encapsulation)机制的重要组成部分,用于控制哪些代码可以访问这些程序元素。
1.四种权限修饰符
Java 提供了四种不同的访问级别,它们的限制范围是逐级递增的:
权限修饰符 | 关键字 | 同一类(Same Class) | 同一包(Same Package) | 子类(Subclass, 不同包) | 任意位置(Anywhere) |
---|---|---|---|---|---|
私有 | private | 可见 | 不可见 | 不可见 | 不可见 |
默认 | (无关键字) | 可见 | 可见 | 不可见 | 不可见 |
受保护 | protected | 可见 | 可见 | 可见 | 不可见 |
公共 | public | 可见 | 可见 | 可见 | 可见 |
2.private(私有)
private
是限制最严格的修饰符。
-
作用: 只能在定义该成员的类内部访问。
-
用途: 主要用于封装类的内部状态和实现细节。例如,类的成员变量通常设为
private
,然后通过公共(public
)的getter/setter 方法
供外部间接访问,隐藏类的内部实现,实现数据保护。 -
注意: 类(Class)本身不能用
private
修饰。
public class User {private String name; // 外部无法直接访问public String getName() {return name;}public void setName(String name) {this.name = name;}
}
3. 默认(无修饰符)
当没有指定任何权限修饰符时,Java 会自动应用默认权限。
-
作用: 只能在同一个包(Package)内访问,即使是当前包的子包也无法访问。
-
用途: 用于实现包级别的封装。如果一个类或成员只需要在同一个项目模块(同一个包)内被其他类访问,不希望外部访问,就可以使用默认权限。
-
注意: 默认权限常用于将一组紧密关联的类组织在一起。
// 在 com.app.data 包中
class DataProcessor { // 默认权限:只能在 com.app.data 包内访问void process() { // 默认权限方法// ...}
}
关键区别(与子包的关系)
虽然包名看起来有父子关系(例如 com.app.data
和 com.app.data.utils
),但在 Java 权限机制中,它们被视为完全独立的包。
4.protected(受保护)
protected
权限比默认权限更开放,它允许子类跨包访问父类的成员。
-
作用: 可以在同一个包内访问;也可以在不同包中的子类中访问。
-
用途: 通常用于设计父类,允许子类扩展或使用父类的核心功能,但不希望完全暴露给不相关的外部代码。
-
访问限制:
-
子类访问: 子类即使在不同的包中,也可以直接访问父类
protected
成员。 -
非子类访问: 在不同包中的非子类无法访问
protected
成员。
-
// 父类在 com.base 包中
public class Parent {protected int value = 10; // 可以被子类和同一个包中的类访问
}// 子类在 com.client 包中
public class Child extends Parent {public void display() {// 允许:子类可以直接访问父类的 protected 成员System.out.println(value); }
}
5.public(公共)
public
是限制最少的修饰符。
-
作用: 可以被任何位置的代码访问。
-
用途: 用于暴露程序的公共接口和功能,例如主类、公共工具方法、外部 API 接口等。
public class PublicService { // 整个项目可访问public void executeTask() { // 整个项目可调用// ...}
}
-
注意: 如果一个 Java 源文件(.java 文件)中包含一个 public 顶级类,那么该源文件的文件名必须与这个 public 类名完全一致(包括大小写)。
示例:
源文件名 顶级类声明 结果 User.java
public class User {}
正确。文件名与 public
类名一致。User.java
public class Person {}
编译错误。文件名必须是 Person.java
。Data.java
class Data {}
正确。类是默认权限,文件名可以自由命名,但通常也建议保持一致。
6.权限修饰符的设计思路
优先使用最小可见性原则(least privilege):
-
能用 private 就不用 public。
-
逐步放大权限,只暴露必要接口。
常见设计模式:
-
属性 → private
-
内部辅助类 → 默认
-
父类扩展接口 → protected
-
公共 API → public