protected修饰符允许同一包内所有类及不同包子类访问被修饰成员;子类无论是否同包均可直接通过this或super访问,但外部代码(含子类实例)不可越权调用。

protected 修饰符在 Java 中的核心作用是:允许**同一包内的类**和**不同包中的子类**访问被修饰的成员(字段、方法、构造器),但不允许不同包中的非子类直接访问。
子类中如何访问父类的 protected 成员
只要子类继承了声明 protected 成员的父类,无论子类是否在同一个包中,都可以在子类内部**直接通过 this 或实例名访问**这些成员(字段和方法)。
- 子类与父类同包:可直接访问,无需额外条件
- 子类与父类不同包:仍可直接访问(这是 protected 区别于 private 和默认包访问的关键)
- 访问方式和访问 public 成员一样,例如:this.fieldName、super.methodName()、obj.protectedMethod()(obj 是子类或父类实例)
注意:protected 不代表“子类专属”,也不开放给外部任意调用
即使子类能访问父类的 protected 成员,外部代码(即使是子类的实例)也不能随意调用——除非满足包内访问或通过子类自身暴露的公开接口。
- ❌ 错误示例(不同包中):Parent p = new Parent(); p.protectedMethod(); → 编译失败(Parent 不是当前类,也不在同包)
- ✅ 正确示例(在子类 Sub 中):this.protectedField = 10; 或 super.protectedMethod();
- ✅ 子类可提供 public 方法封装 protected 成员,供外界间接使用
常见误区澄清
- protected 不是“只给子类用”:同包下的非子类也能访问,这点常被忽略
- 子类不能降低访问权限:重写 protected 方法时,不能改成 private 或默认(包级);可改为 public 或保持 protected
- 构造器用 protected 的含义:表示该类只能被继承,不能被外部 new 实例(常用于模板类、抽象基类)


















