在Java中,通过访问控制符对类、成员变量和成员方法的访问权限进行管理。初学者常对public、private、protected以及默认(包访问权限)之间的区别感到困惑,特别是protected与默认访问权限的差异较为模糊。本文将详细解析这几种访问修饰符的具体作用范围和使用场景,帮助理解它们在不同情况下的可见性规则,从而更好地掌握Java中的封装特性与访问控制机制。
1、 private是访问修饰符,仅允许在定义它的类内部进行访问。
2、 public与private相反,具有最高访问权限,可在任何位置被调用和访问。
3、 在同一个包内,protected成员可被任意类访问;而在不同包中,仅允许其子类进行访问。例如,package1中的类A有一个受protected修饰的成员变量a。
4、 所示,若同一包内的另一个类继承自A,则可访问A的该成员变量。此外,同一包中未继承A的普通类同样能访问该成员变量,具体效果可自行验证。
5、 所示,其他包中的普通类无法访问A类的成员变量。
6、 其他包中继承自A的子类可以访问A的成员变量。
7、 接着讨论默认访问权限(包权限),所示,仍为package1中A类的成员变量a,此次不添加任何修饰符。
8、 在同一个包中,无论是否为子类,所有类均可访问该成员变量,其访问权限与protected在包内一致。
9、 位于其他包中的普通类,无法访问A类中的该成员变量,其访问权限与protected相同。
10、 位于其他包中的类,即便作为子类,也无法访问A类的该成员变量,这与protected的访问权限有所不同。
11、 private表示仅在本类内部可访问,外部无法调用;public则完全公开,任何类都可以访问;默认的包访问权限(即不加修饰符)允许同一包内的所有类访问,包括该包中的子类和普通类;protected也允许同一包内的所有类访问,其作用范围与默认权限在包内相同。不同之处在于,当涉及不同包时,默认权限不允许跨包访问,而protected允许其他包中的子类访问,但不允许其他包中的非子类普通类访问。因此,protected与默认访问权限的主要区别体现在跨包情形下:前者对继承的子类开放,后者则完全封闭。总体来看,这四种访问控制级别从严格到宽松依次为private、默认、protected、public,各自适用于不同的封装需求场景。
