访问权限
Java 访问权限修饰符详解
在 Java 中,访问权限修饰符用于控制类、属性、方法的可见范围,是封装特性的核心实现手段。合理使用访问权限可以隐藏内部实现细节、保护数据安全,并降低代码耦合度。Java 提供四种访问权限,从最大到最小依次为:public、protected、包访问权限(default,无修饰符)、private。
包(Package):访问权限的基础
包是类的组织单位,用于避免类名冲突并划分访问边界。一个类的全名是 “包名 + 类名”(如 java.util.ArrayList)。通过 import 语句可以简化类的使用(如 import java.util.ArrayList)。
- 同包类:位于同一包下的类,默认具有包访问权限。
- 不同包类:位于不同包下的类,需通过
public或protected权限才能访问。
四种访问权限详解
1. public(公共权限)
- 可见范围:所有类(本类、同包类、子类、非子类)均可访问。
- 适用场景:暴露给外部的接口(如
java.util.List的add方法)。
public class PublicDemo {
public String publicField = "公共属性";
public void publicMethod() {
System.out.println("公共方法");
}
}
// 任意类均可访问
public class OtherClass {
public static void main(String[] args) {
PublicDemo demo = new PublicDemo();
System.out.println(demo.publicField); // 合法
demo.publicMethod(); // 合法
}
}
2. protected(保护权限)
- 可见范围:本类、同包类、子类(无论是否同包)可访问,非子类不可访问。
- 适用场景:仅允许子类继承或同包类协作的成员(如模板方法中的辅助方法)。
package com.example.parent;
public class ProtectedDemo {
protected String protectedField = "保护属性";
protected void protectedMethod() {
System.out.println("保护方法");
}
}
// 同包类:可访问
package com.example.parent;
public class SamePackageClass {
public static void main(String[] args) {
ProtectedDemo demo = new ProtectedDemo();
System.out.println(demo.protectedField); // 合法
}
}
// 不同包子类:可访问
package com.example.child;
import com.example.parent.ProtectedDemo;
public class SubClass extends ProtectedDemo {
public void test() {
System.out.println(protectedField); // 合法(继承自父类)
protectedMethod(); // 合法
}
}
// 不同包非子类:不可访问
package com.example.other;
import com.example.parent.ProtectedDemo;
public class OtherClass {
public static void main(String[] args) {
ProtectedDemo demo = new ProtectedDemo();
// System.out.println(demo.protectedField); // 编译报错
}
}
3. 包访问权限(default,无修饰符)
- 可见范围:仅本类和同包类可访问,子类(不同包)和非子类不可访问。
- 适用场景:包内部的辅助类或成员,不对外暴露(如工具类的内部方法)。
