不同包的非子类只能访问 public 成员;public 类须独立定义在同名文件中,可被任意包导入并实例化,其方法和字段可通过对象引用直接调用;protected、default、private 均因设计限制而不可见。

Java 中不同包的非子类,对任何访问修饰符都有明确且严格的限制:只有 public 成员可被访问,其余全部不可见。
不同包非子类能访问什么?
仅限 public 修饰的成员(类、方法、字段、构造器)。
- public 类必须单独定义在同名 .java 文件中,且可被任意包 import 并实例化
- public 方法和字段可通过对象引用直接调用,例如:
obj.publicMethod() - protected、default、private 成员——无论是否继承、是否同名、是否手动强转——一律编译报错
为什么 protected 和 default 都不行?
它们的设计本意就排除了这种场景:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- protected 允许“同包任意类”或“不同包子类”,但非子类跨包时完全不满足任一条件
- default(无修饰符)只认“包”,不认“关系”,跨包即切断所有访问路径,子类身份也无效
- private 更不用说,连同包非子类都不可见,跨包更不可能
常见误操作与编译错误提示
以下写法在不同包的非子类中均会失败:
-
parentObj.protectedMethod()→ 编译错误:protectedMethod() has protected access in Parent -
parentObj.defaultField = 10→ 编译错误:defaultField is not public in Parent; cannot be accessed from outside package -
new Parent().privateMethod()→ 编译错误:privateMethod() has private access in Parent
想让非子类跨包使用,该怎么做?
有且仅有两种合规方式:
- 将目标成员声明为 public(适用于需对外暴露的 API)
- 提供 public 的 getter/setter 或代理方法,在父类内部封装对 protected/default 成员的访问逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










