子类可直接访问继承的protected属性,但仅限自身代码中;通过父类引用或跨包访问会编译错误。需显式声明protected,不可用private或默认修饰符。

子类可以安全修改父类的 protected 属性,前提是属性确实声明为 protected,且访问发生在子类自身的代码上下文中——不是通过父类类型引用,也不依赖跨包误用。
确保属性声明为 protected
父类中必须显式使用 protected 修饰符,而非 private 或默认(包私有):
-
✅ 正确示例:
protected String name;或protected int count; -
❌ 错误示例:
private String name;—— 子类无法直接访问;String name;(无修饰符)—— 跨包子类不可见
在子类内部直接读写继承来的属性
子类无需 getter/setter 就能操作该属性,因为 protected 成员在继承后成为子类“自有成员”的一部分:
-
this.name = "Alice";—— 显式用this调用合法 -
name = "Bob";—— 省略this同样合法(在子类方法或构造器中) -
System.out.println(name);—— 直接读取没问题
避免常见编译错误
这些写法会直接报错,哪怕运行时对象确实是子类实例:
-
Parent p = new Child(); p.name = "error";—— 类型是Parent,跨包时不可见 -
new Parent().name = "nope";—— 父类对象在包外不能暴露protected成员 -
Child c = new Child(); Parent p = c; p.name = "...";—— 引用类型决定可见性,不是实际类型
跨包时的特别注意事项
若父类与子类不在同一包,protected 的可见性规则更严格:
- 子类可自由访问自己继承来的
protected字段和方法(如name、doWork()) - 但不能通过任何
Parent类型的变量(哪怕是Child实例赋值而来)去调用 - 也不能在子类中 new 一个父类对象再访问其
protected成员

















