Java 是一种面向对象的编程语言,它提供了四种不同的访问权限,用于控制类成员(变量和方法)的可见性。这些访问权限对于封装和数据隐藏至关重要,它们分别是:public、protected、private 和默认(无修饰符)访问权限。
当前类 | 同一个包 | 不同包的子类 | 不同包的非子类 | 其他包 | |
---|---|---|---|---|---|
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | ||
default | √ | √ | |||
private | √ |
1、Public 访问权限
public
是最宽松的访问权限,它允许任何其他类访问该成员。无论是同一个包内的类还是不同包内的类,都可以访问 public
成员。
示例
public class PublicClass {
public int publicVar = 10;
public void publicMethod() {
System.out.println("Public Method");
}
}
class TestPublic {
public static void main(String[] args) {
PublicClass pc = new PublicClass();
System.out.println(pc.publicVar); // 可以访问
pc.publicMethod(); // 可以访问
}
}
2、Private 访问权限
private
是最严格的访问权限,它只允许同一个类内部访问该成员。即使是同一个包内的其他类也无法访问 private
成员。
示例
class PrivateClass {
private int privateVar = 20;
private void privateMethod() {
System.out.println("Private Method");
}
public void accessPrivate() {
System.out.println(privateVar); // 允许访问
privateMethod(); // 允许调用
}
}
class TestPrivate {
public static void main(String[] args) {
PrivateClass pc = new PrivateClass();
// System.out.println(pc.privateVar); // 编译错误,无法访问
// pc.privateMethod(); // 编译错误,无法调用
pc.accessPrivate(); // 正确,通过公共方法访问
}
}
3、Protected 访问权限
protected
访问权限介于 public
和 private
之间。它可以被同一个包内的类以及不同包中的子类访问。
示例
class ProtectedClass {
protected int protectedVar = 30;
protected void protectedMethod() {
System.out.println("Protected Method");
}
}
class SubClass extends ProtectedClass {
public void accessProtected() {
System.out.println(protectedVar); // 允许访问
protectedMethod(); // 允许调用
}
}
class TestProtected {
public static void main(String[] args) {
ProtectedClass pc = new ProtectedClass();
// System.out.println(pc.protectedVar); // 编译错误,包外无法访问
// pc.protectedMethod(); // 编译错误,包外无法调用
SubClass sc = new SubClass();
sc.accessProtected(); // 正确,子类可以访问
}
}
4、默认(无修饰符)访问权限
如果没有指定任何访问权限修饰符,那么成员的访问权限就是默认的,它只能被同一个包内的其他类访问。
示例
class DefaultAccess {
int defaultVar = 40;
void defaultMethod() {
System.out.println("Default Method");
}
}
class TestDefault {
public static void main(String[] args) {
DefaultAccess da = new DefaultAccess();
System.out.println(da.defaultVar); // 包内可以访问
da.defaultMethod(); // 包内可以调用
}
}
// 如果尝试在不同包中访问 DefaultAccess 类的成员,将会导致编译错误。
结论
Java 的四种访问权限提供了灵活的方式来控制类成员的可见性。
public
允许最广泛的访问;
private
则提供了最严格的封装;
protected
允许子类访问;
默认访问权限default
则限制了访问范围在同一包内。