protected成员包内任意类可访问、跨包子类仅能通过继承调用(不可用父类引用),构造器仅限包内或子类super()调用。

protected 修饰符在 Java 中的访问规则,核心是“包内可见 + 子类可见”,但两者不叠加、不扩大,需分开理解。
同一包内:无需继承关系也能访问
只要类在同一个包中,无论是否继承,都可以直接访问 protected 成员(字段、方法、构造器)。这和 default(包级私有)权限表现一致。
- 例如:A 类定义了 protected void show() { },同包的 B 类可直接调用 a.show(),哪怕 B 不是 A 的子类
- 注意:这种访问必须通过对象实例(非 this),且不能跨包
不同包中的子类:只能通过继承方式访问
子类在其他包中时,protected 成员仅对其自身继承得到的成员有效,不能通过父类引用访问。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ✅ 正确:子类 C 中写 this.show() 或直接调用 show()(假设已继承)
- ❌ 错误:C 类中写 new A().show() —— 即使 A 是父类,也不允许;也不能用 A 类型的变量引用调用,如 A a = new C(); a.show();
- 关键点:访问主体必须是“当前子类实例本身”,不是任意父类实例
不能被包外非子类访问
如果类既不在同一包,又没有继承关系,即使知道该成员存在,也无法访问。
- 例如:D 类在另一个包,且不是 A 的子类,则无法访问 A 的任何 protected 成员
- 编译器会报错:error: show() has protected access in A
构造器的 protected 特殊性
声明为 protected 的构造器,只允许本包内调用,或被不同包中的子类用于 super() 调用(即子类构造器中显式或隐式调用父类构造器)。
- 不能在包外通过 new A() 创建实例
- 但子类 C 的构造器中可以写 super(...),前提是父类构造器是 protected 或更宽权限
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










