子类构造函数中属性初始化的核心是父类负责自身属性、子类只初始化新增属性,且必须先调用super()再操作this;引用类型需在constructor中用this独立创建,方法应定义在原型上而非constructor内。

子类构造函数中初始化属性,核心是明确“谁来初始化”和“什么时候初始化”。父类负责自身专属属性,子类只管自己新增的;所有实例属性必须在构造函数内用 this 显式赋值,且顺序固定、类型一致。
必须第一行调用 super(),再操作 this
ES6 class 语法下,子类 constructor 中 super() 必须是第一句。不调用会报错;提前访问 this 也会报错。super() 的作用是触发父类构造函数执行,并让 this 指向即将完成初始化的新实例。
- 父类有参数(如
constructor(id, name)),子类 super() 就得传对应值:super(id, name) - 父类没写 constructor,super() 仍会调用默认空构造函数,安全无副作用
- super() 执行完,父类的实例属性(如
this.id、this.colors = [])才真正挂载到 this 上
父类属性由父类构造函数初始化,子类不重复定义
子类不该在自己的 constructor 里重新初始化父类已声明的属性(比如再写 this.name = name),除非是覆盖逻辑。正确做法是:让父类构造函数完成它该做的事,子类只专注新增字段。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- ✅ 正确:父类处理
this.name和this.tags = [];子类只加this.breed或this.grade - ❌ 错误:子类 constructor 里又给
this.name赋值,既冗余,又可能破坏父类初始化意图 - 引用类型(数组、对象)尤其不能放在 prototype 上共享,必须在构造函数中用
this.xxx = []独立创建
子类自有属性在 super() 后立即初始化
子类自己的实例字段,应在 super() 调用之后、constructor 主体其他逻辑之前统一赋值。这样既保证顺序可控,也利于 V8 引擎生成稳定隐藏类,提升后续属性访问性能。
- 推荐风格:
super(); this.breed = breed; this.level = level || 1; this.skills = []; - 避免条件分支中动态添加属性,例如不要写
if (opts) { this.config = opts; },否则导致隐藏类分裂 - 字段初始化器(如
breed = 'dog';)虽自动执行,但时机在 super() 返回后、constructor 前,适合简单默认值;复杂逻辑仍建议写进 constructor 开头
别在构造函数里重复定义方法
方法属于行为复用,不是每个实例都需要一份副本。把方法写在 constructor 内(如 this.say = function() {})会浪费内存,也违背面向对象设计原则。
- ✅ 正确:方法写在 class 体中(非 constructor 内),自动挂载到原型上,所有实例共享
- ✅ 正确:使用原型链方式时,统一挂到
Child.prototype.sayName = function() {} - ❌ 错误:在 constructor 里反复声明函数,造成每个实例都多占一份内存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










