在java中,访问控制符用于限定类、成员变量及成员方法的可访问范围。初学者往往难以区分public、private、protected以及默认(即包级)访问权限之间的异同,尤其是protected与默认权限在跨包继承场景下的行为差异容易混淆。本文将系统梳理这四种修饰符的作用边界与适用条件,深入剖析它们在各类上下文中的可见性规则,助力开发者更准确地运用封装原则与访问控制机制。
1、 private作为最严格的访问修饰符,仅允许在声明该成员的类内部进行访问和调用。

2、 public则代表最宽松的访问级别,不受任何包或继承关系限制,可在项目任意位置被其他类直接访问。

3、 protected成员在本包内对所有类开放;当处于不同包时,则仅限于其子类访问。例如,package1中的类A定义了一个被protected修饰的成员变量a。

4、 如图所示,若同一包下存在一个继承自A的类,则该子类可以正常访问变量a;同时,即使未继承A的普通类,只要位于相同包中,也能直接访问该protected成员,实际效果可通过代码验证。

5、 如图所示,在其他包中定义的非继承类无法访问A中的protected变量a。

6、 而在其他包中继承A的子类,依然可以合法访问父类A中被protected修饰的变量a。

7、 接下来分析默认访问权限(即不显式添加任何修饰符),仍以package1中类A的成员变量a为例,此次不使用任何访问控制关键字。

8、 在同一包内,无论是否为A的子类,所有类均可访问该变量,其可见性范围与protected在包内表现一致。

9、 当访问发生在其他包中的普通类时,该变量不可见,此时默认权限与protected在跨包非子类场景下的限制相同。

10、 关键区别在于:其他包中继承A的子类,也无法访问该默认权限的变量a——这一点明显区别于protected的跨包子类可访问特性。

11、 总结而言:private仅限本类访问;public全局可见;默认权限支持同包内所有类(含子类与普通类)访问;protected在包内与默认权限等效,但在跨包时额外向子类开放访问通道。因此,二者的核心差异集中于“其他包中的子类能否访问”这一维度:protected允许,而默认权限禁止。综合来看,四者的访问严格程度由高到低依次为:private → 默认 → protected → public,分别对应不同的封装粒度与设计意图。











