在 Java 中,访问权限(Access Modifiers)用于控制类、方法、成员变量等的访问范围。合理使用访问权限能够增强代码的安全性、封装性以及可维护性。
Java 的访问权限修饰符
Java 提供了以下四种访问权限修饰符,分别是:
修饰符 | 类内 | 同包 | 子类 | 跨包 |
---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ (除非通过继承访问) |
default(无修饰符) | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
1. public
特点:
public
表示全局访问权限。- 可以被任何其他类访问,无论是否位于同一个包中。
应用场景:
- 类:类可以被任何地方使用。
- 方法和变量:通常用于工具类方法、常量,或者明确需要对外公开的接口。
示例:
public class PublicExample {
public int publicField = 10;
public void publicMethod() {
System.out.println("This is a public method.");
}
}
访问示例:
- 在同一个包或不同包中都可以访问:
PublicExample example = new PublicExample(); example.publicMethod(); // 可访问 System.out.println(example.publicField); // 可访问
2. protected
特点:
protected
表示受保护权限。- 只能在同一个包中访问,或通过继承关系由子类访问。
应用场景:
- 方法和变量:用于希望对子类开放但不对外公开的成员。
示例:
package package1;
public class ProtectedExample {
protected int protectedField = 20;
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
访问示例:
-
同包访问:
package package1; public class SamePackage { public void accessProtected() { ProtectedExample example = new ProtectedExample(); example.protectedMethod(); // 可访问 System.out.println(example.protectedField); // 可访问 } }
-
跨包访问(通过子类):
package package2; import package1.ProtectedExample; public class SubClass extends ProtectedExample { public void accessProtected() { protectedMethod(); // 可访问 System.out.println(protectedField); // 可访问 } }
-
跨包无继承关系时无法访问。
3. 默认(Default / Package-Private)
特点:
- 如果没有指定修饰符,则默认是包级私有权限(package-private)。
- 只能在同一个包中访问,跨包访问不允许。
应用场景:
- 类:限制类仅在包内部使用。
- 方法和变量:适用于内部实现细节,不需要对子类或外部提供访问权限。
示例:
package package1;
class DefaultExample { // 无修饰符,包级私有类
int defaultField = 30; // 默认权限
void defaultMethod() { // 默认权限
System.out.println("This is a default method.");
}
}
访问示例:
-
同包访问:
package package1; public class SamePackage { public void accessDefault() { DefaultExample example = new DefaultExample(); example.defaultMethod(); // 可访问 System.out.println(example.defaultField); // 可访问 } }
-
跨包访问不允许:
package package2; import package1.DefaultExample; // 无法导入,编译错误
4. private
特点:
private
表示私有权限。- 只能在类的内部访问,其他类(即使是同一个包中的类)无法访问。
应用场景:
- 方法和变量:用于封装类的内部实现细节,不允许外部直接访问。
示例:
public class PrivateExample {
private int privateField = 40;
private void privateMethod() {
System.out.println("This is a private method.");
}
public void accessPrivate() {
System.out.println(privateField); // 类内部访问
privateMethod(); // 类内部访问
}
}
访问示例:
- 只能在类内部访问:
PrivateExample example = new PrivateExample(); example.accessPrivate(); // 通过公共方法访问私有成员
5. 类的访问权限
类的权限修饰符:
public
类:可以被任何包中的类访问。default
类:只能被同一个包中的类访问。- 类不能使用
private
或protected
修饰。
示例:
// 包级私有类
class PackagePrivateClass {
void method() {
System.out.println("This is a package-private class.");
}
}
// 公共类
public class PublicClass {
public void method() {
System.out.println("This is a public class.");
}
}
访问权限的设计原则
-
信息隐藏:
- 使用
private
隐藏实现细节,防止外部直接操作类的内部状态。 - 提供
public
或protected
的方法(如 Getter/Setter)来控制对私有数据的访问。
- 使用
-
最小化访问范围:
- 优先选择更严格的访问权限(如
private
),然后根据需要逐步放宽。 - 确保不会暴露不必要的接口或数据。
- 优先选择更严格的访问权限(如
-
包内模块化:
- 使用
default
权限将类或成员限制在包内,便于模块化管理。
- 使用
-
继承与扩展:
- 使用
protected
允许子类访问需要的功能,同时隐藏不必要的细节。
- 使用
总结
修饰符 | 适用范围 | 访问范围 | 典型用途 |
---|---|---|---|
public | 类、方法、变量 | 任意地方 | 公共 API、工具类、通用方法 |
protected | 方法、变量 | 同包或子类 | 继承支持,允许子类扩展功能 |
default | 类、方法、变量 | 同包内可访问 | 内部实现,不需要对外暴露的功能 |
private | 方法、变量 | 仅类内部 | 封装类的内部实现细节,保护类的完整性 |
通过合理使用这些访问修饰符,可以有效控制代码的访问权限,增强系统的封装性和安全性。