最有效查漏补缺方式是对照访问范围表并动手验证三组实验;重点区分protected跨包子类只能继承访问、不可通过父类实例访问,包私有不被子类继承,private仅限同类访问。

直接看访问范围表+动手验证是最有效的查漏补缺方式。光背规则容易混淆,尤其 protected 和默认权限在跨包子类场景下特别容易出错。
对照表格快速定位薄弱点
把这四行记牢,重点盯第三列(子类)和第四列(其他包):
- public:同类 ✅|同包 ✅|子类 ✅|其他包 ✅
- protected:同类 ✅|同包 ✅|子类 ✅|其他包 ❌(但注意:跨包子类只能通过 继承 访问,不能通过父类实例访问)
- 无修饰符(包私有):同类 ✅|同包 ✅|子类 ❌|其他包 ❌
- private:同类 ✅|同包 ❌|子类 ❌|其他包 ❌
写三组小实验代码验证理解
不运行就等于没掌握。建议手写以下三个典型场景并编译观察报错:
- 新建两个包:
pkg1.A(含protected和package-private成员),pkg2.B继承A→ 看哪些能访问、哪些编译失败 - 在
pkg2.B中 new 一个pkg1.A实例 → 尝试访问其protected成员 → 会报错,这是关键分水岭 - 在
pkg2.C(非子类)中 newpkg1.A→ 测试public/protected/ 包私有 /private的可访问性边界
盯住高频易错细节
这些地方教材常一笔带过,却是面试和调试时的雷区:
- 类本身只能用 public 或 无修饰符;
protected class和private class(顶层类)直接编译报错 - 子类重写方法时,访问权限不能变严格:父类
protected,子类只能是protected或public,不能降为包私有或private - 接口中方法默认
public abstract,字段默认public static final;Java 9+ 才支持private接口方法,protected在接口里始终非法 -
private不是为了“防黑客”,而是为了封装——强制通过 getter/setter 控制状态变更逻辑
结合设计意图反向记忆
每个修饰符背后都有明确的面向对象目标:
- private → 把实现细节锁死在类内部,别人改不了你的字段,只能走你开放的通道
- 包私有 → 同一模块内协作,比如 utils 包里的解析工具,不希望被外部项目误用
- protected → “留给子孙用的遗产”,父类留出扩展点,但不许外人动
- public → 明确对外承诺的契约,一旦发布就不能随便删改,否则破坏兼容性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











