Java中的this关键字除了可以访问当前对象的成员变量和成员方法外,还支持调用本类的其他构造方法,这一特性可以有效减少构造方法中重复代码的编写,提升代码的复用性。不过this调用构造方法有着严格的语法规范,不符合规范就会引发编译错误。

基本语法规则
使用this调用本类其他构造方法时,语法格式为this(参数列表),参数列表需要和要调用的构造方法的参数列表匹配,具体需要遵循以下几个核心规范:
- this调用构造方法的语句必须放在构造方法的第一行,不能出现在构造方法的其他位置,否则会直接编译失败。
- 一个构造方法中最多只能使用一次this调用其他构造方法,不能多次调用。
- this调用构造方法不能形成递归调用,也就是不能出现A构造方法调用B构造方法,B构造方法又调用A构造方法的情况。
代码示例演示
下面通过一个学生类的示例来展示正确的使用方式,该类包含无参构造方法和带参数的构造方法,使用this实现构造方法的复用:
public class Student {
private String name;
private int age;
// 无参构造方法
public Student() {
// 调用带两个参数的构造方法,给name和age赋默认值
this("未知", 0);
}
// 带一个参数的构造方法
public Student(String name) {
// 调用带两个参数的构造方法,age赋默认值
this(name, 0);
}
// 带两个参数的构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void printInfo() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("张三");
Student s3 = new Student("李四", 20);
s1.printInfo();
s2.printInfo();
s3.printInfo();
}
}
上述代码中,无参构造方法和单参数构造方法都通过this调用了双参数构造方法,避免了重复编写赋值逻辑,符合语法规范,运行后输出的结果分别是姓名:未知,年龄:0;姓名:张三,年龄:0;姓名:李四,年龄:20。
常见错误场景
很多开发者在使用this调用构造方法时容易犯以下几类错误:
错误1:this调用语句不在构造方法第一行
public class Demo {
private int num;
public Demo() {
System.out.println("初始化");
// 错误:this调用不在第一行
this(10);
}
public Demo(int num) {
this.num = num;
}
}
上述代码会在编译时提示错误,因为this调用没有放在构造方法的第一行。
错误2:构造方法递归调用
public class Demo {
private int num;
public Demo() {
// 调用带参数的构造方法
this(10);
}
public Demo(int num) {
// 错误:又调用无参构造方法,形成递归
this();
this.num = num;
}
}
这种递归调用会导致编译错误,因为构造方法无法完成初始化逻辑。
错误3:在普通方法中使用this调用构造方法
public class Demo {
private int num;
public Demo() {
this.num = 0;
}
public void test() {
// 错误:普通方法中不能使用this调用构造方法
this();
}
}
this调用构造方法的语法仅能在构造方法中使用,普通成员方法中这样写会直接编译失败。
注意事项
如果同一个类中存在多个重载的构造方法,使用this调用时要确保参数列表和其中一个构造方法的参数列表完全匹配,否则会因为找不到对应的构造方法而报错。另外,如果构造方法中既需要调用父类构造方法又需要调用本类其他构造方法,要注意super调用必须放在第一行,而this调用也要求在第一行,因此两者不能同时出现在一个构造方法中。