在Java的面向对象编程中,同一个类可能会定义多个重载的构造方法,这些构造方法往往包含部分重复的初始化逻辑。为了减少代码冗余,Java提供了this()语法,允许在同一个类的构造方法中调用其他构造方法,实现初始化逻辑的复用。

this()的基本语法与作用
this()是Java中用于调用同一个类中其他构造方法的特殊语法,它必须作为构造方法的第一条执行语句出现。通过this()可以传递对应的参数,匹配对应参数列表的构造方法,从而复用其他构造方法的初始化逻辑。
比如我们有一个用户类,需要同时支持无参构造和带参构造,部分初始化逻辑是共用的,就可以通过this()来复用代码。
this()的使用示例
无参构造调用带参构造
下面的示例中,无参构造通过this("默认用户", 0)调用了带两个参数的构造方法,减少了重复的属性赋值代码:
public class User {
private String name;
private int age;
// 带两个参数的构造方法
public User(String name, int age) {
this.name = name;
this.age = age;
System.out.println("执行带参构造方法,初始化name和age");
}
// 无参构造,调用带参构造
public User() {
// this()必须放在构造方法的第一行
this("默认用户", 0);
System.out.println("执行无参构造方法");
}
public static void main(String[] args) {
User user1 = new User();
System.out.println("user1的name:" + user1.name + ",age:" + user1.age);
User user2 = new User("张三", 20);
System.out.println("user2的name:" + user2.name + ",age:" + user2.age);
}
}
运行上述代码,输出结果如下:
执行带参构造方法,初始化name和age 执行无参构造方法 user1的name:默认用户,age:0 执行带参构造方法,初始化name和age user2的name:张三,age:20
带参构造之间的相互调用
多个带参构造之间也可以通过this()实现调用,比如下面的订单类,三个构造方法逐层调用,最终共用最核心的构造方法的逻辑:
public class Order {
private String orderId;
private double price;
private String remark;
// 核心构造方法,包含所有属性初始化
public Order(String orderId, double price, String remark) {
this.orderId = orderId;
this.price = price;
this.remark = remark;
System.out.println("初始化订单所有属性");
}
// 两个参数的构造方法,调用三个参数的构造,remark设为默认值
public Order(String orderId, double price) {
this(orderId, price, "无备注");
System.out.println("执行两个参数的构造方法");
}
// 一个参数的构造方法,调用两个参数的构造,price设为0
public Order(String orderId) {
this(orderId, 0.0);
System.out.println("执行一个参数的构造方法");
}
public static void main(String[] args) {
Order order1 = new Order("O001");
System.out.println("订单1价格:" + order1.price + ",备注:" + order1.remark);
Order order2 = new Order("O002", 99.9);
System.out.println("订单2价格:" + order2.price + ",备注:" + order2.remark);
}
}
this()的使用限制
使用this()时需要注意以下几点,否则会导致编译错误:
- this()必须作为构造方法的第一条执行语句,不能在它之前写任何其他代码,哪怕是一行打印语句也不行。
- 一个构造方法中只能使用一次this(),不能同时调用多个其他构造方法。
- this()和super()不能同时出现在一个构造方法中,因为super()也要求必须是构造方法的第一条语句,二者只能选其一。
- this()不能用于普通方法中,只能用在构造方法里。
- 调用时需要保证参数列表匹配,否则会找不到对应的构造方法导致编译错误。
常见误区说明
很多开发者会混淆this()和this.属性名的用法,前者是调用构造方法,后者是访问当前对象的属性,二者作用完全不同。另外要注意,构造方法之间的调用不能形成闭环,比如构造方法A调用构造方法B,构造方法B又调用构造方法A,这会导致无限递归,编译时就会报错。
总结
this()是Java中实现同一个类构造方法之间逻辑复用的重要语法,合理使用可以减少重复代码,让构造方法的结构更清晰。使用时只要记住必须放在构造方法第一行、不能和super()共用、不能形成递归调用这几个核心规则,就可以避免大部分使用问题。