抽象类的属性继承规则与普通类相同:子类继承public、protected和默认访问权限的属性,不继承private属性;同名字段用this和super区分;初始化顺序为父类先于子类;设计上推荐private属性配protected/public getter/setter。

抽象类中的属性继承和普通类一样,子类会直接继承父类中所有非私有的成员变量(即 public、protected 和默认(包级)访问权限的属性),但不会继承 private 属性。
子类能访问哪些抽象类的属性
抽象类定义的属性只要不是 private,子类就能继承并直接使用:
- public 属性:子类可直接访问,无限制
- protected 属性:子类可直接访问,即使在不同包中也生效
- 默认(包级) 属性:子类在同一包下可直接访问;跨包则不可见
- private 属性:子类无法继承、不可见、不可直接访问,只能通过父类提供的 public/protected getter 方法间接获取
属性重名时如何区分父类和子类的同名字段
如果子类定义了与抽象父类同名的属性(比如都叫 name),访问时需明确指定作用域:
-
this.name→ 访问子类自己的属性 -
super.name→ 访问抽象父类中继承来的 非 private 属性 - 若父类属性是 private,
super.name编译报错,必须改用父类提供的getName()等方法
构造过程中属性的初始化顺序
子类构造方法执行时,会先调用父类(含抽象类)构造器(隐式或显式 super()),因此:
- 抽象父类中的属性会在子类属性之前完成初始化(按声明顺序 + 构造器逻辑)
- 子类可通过
super(…)显式传参,驱动抽象父类带参构造器,从而控制父类属性初始值 - 不建议在抽象类构造器中调用可能被子类重写的 abstract 或普通方法(存在未初始化风险)
设计建议:抽象类中属性怎么写更合理
为兼顾封装性与可继承性,推荐做法:
- 属性尽量用 private,搭配 protected 或 public 的 getter/setter,让子类可控访问
- 避免在抽象类中暴露大量 public 字段,防止破坏封装和后续重构困难
- 如属性代表通用状态(如
id、createdAt),可设为 protected,方便子类直接读写 - 不要依赖子类去“修复”父类 private 属性的缺失——该有的初始化逻辑应放在抽象类构造器中

















