this()用于本类构造方法间调用,super()用于调用父类构造方法,二者均须位于构造方法首行;this()避免重复初始化,不可循环调用。

在 Java 中,this() 和 super() 是构造方法中实现逻辑复用的关键机制,但它们的使用有严格限制和明确分工:前者用于本类构造方法之间的调用,后者用于调用父类构造方法,且都必须是构造方法中的第一条语句。
✅ this():复用本类其他构造逻辑
this() 用来在当前类的一个构造方法中调用另一个构造方法,避免重复编写初始化代码(比如参数校验、默认值设置、资源预分配等)。
- 必须放在构造方法的第一行
- 只能调用本类中已定义的其他构造方法,不能循环调用(如 A 调 B,B 又调 A)
- 常见用法是“多参数构造器 → 少参数构造器”,把共用逻辑集中到一个主构造器中
例如:
class Person {private String name;
private int age;
// 主构造器,包含完整初始化逻辑
Person(String name, int age) {
if (name == null || name.trim().isEmpty()) throw new IllegalArgumentException("Name cannot be blank");
if (age this.name = name.trim();
this.age = age;
}
// 复用主构造器,提供默认年龄
Person(String name) {
this(name, 0); // ← this() 复用校验和赋值逻辑
}
}
✅ super():复用父类构造逻辑
super() 用于调用直接父类的构造方法,确保父类状态被正确初始化。这是继承体系中保障“先有父,再有子”的基础规则。
- 同样必须是构造方法的第一条语句
- 若子类构造器未显式写
super(...),编译器会自动插入无参的super() - 当父类没有无参构造器时,子类必须显式调用带参的
super(...),否则编译失败
例如:
class Animal {protected String species;
Animal(String species) {
this.species = Objects.requireNonNull(species);
}
}
class Dog extends Animal {
private String breed;
// 必须显式调用父类构造器
Dog(String species, String breed) {
super(species); // ← 复用 Animal 的非空校验和赋值
this.breed = breed;
}
}
⚠️ 注意事项与常见误区
二者不可共存于同一构造方法中——因为都必须是第一句,冲突不可避免;也不能在普通方法或静态上下文中使用。
- 不写
super()也不写this()?编译器自动补super()(仅限父类有无参构造) - 想同时复用父类和本类其他构造逻辑?只能通过提取公共初始化方法(如
init(...))来间接实现 -
this()和super()都不支持条件调用(如 if 分支中调用),必须无条件出现在首行
? 实用建议:组合使用提升可维护性
典型模式是“链式委托”:子类构造器 → 调用本类主构造器(this(...))→ 主构造器中调用父类构造器(super(...))。
- 把校验、规范化、日志等通用逻辑放在最底层构造器(通常是参数最多的那个)
- 上层构造器只负责提供合理默认值,再委托到底层
- 父类专注自身状态初始化,子类专注扩展字段和行为,职责清晰
这样修改一处校验逻辑,所有构造路径都自动生效,真正实现安全、简洁的复用。










