发布于2026-07-07 阅读(0)
扫一扫,手机访问
在 Ja va 中,构造方法的重载很常见,但如果你写过几个重载构造器,多半会碰到一个问题:重复的初始化代码怎么处理?这里有个语法糖——this(...),它能让你在构造方法中调用本类的另一个构造方法,把初始化流程委托出去,避免重复代码。不过它有几个硬性规矩:必须写在第一行,而且不能和 super(...) 同时出现(因为俩都要求首行)。

简单说,就是当同一个类有多个构造器时,可以让其中一个“主构造器”干完所有初始化工作,其他构造器通过 this(...) 把参数传给它。这样既保证了逻辑统一,又省去了重复写 this.x = x 的麻烦。
this(...) 本质上不是创建新对象,而是将当前构造方法的初始化任务转交给另一个构造器去执行。它最常见的用途就是处理参数组合较多的场景,比如一个带多个可选参数的类,往往只有一个全参构造器做实际赋值,剩下的构造器都靠 this(...) 来委托。
当然,这里有个前提:this(...) 必须出现在构造方法的第一行,否则编译器会直接报错;同时它也不能和 super(...) 同桌吃饭——因为俩都想坐第一把交椅。
假设我们要写一个表示坐标的 Point 类,它可能有三种初始化方式:
最简洁的做法就是让前两个构造器都通过 this(...) 委托给双参构造器:
public class Point { private int x, y; public Point() { this(0, 0); // 委托给双参构造 } public Point(int x) { this(x, 0); // 委托给双参构造 } public Point(int x, int y) { this.x = x; this.y = y; }}
这样修改时只需要动一个构造器(全参的那个),其他构造器自然跟着更新,维护成本大大降低。
虽然 this(...) 用起来很方便,但有几个“坑”需要留意:
this(...) 只能调用本类的构造方法,不能调用父类或静态方法。this(...) 调用的那个构造器(也就是真正干活的)必须存在且可访问。this(...) 时,不能再写 super(...),因为继承的初始化责任已经被转交给被调用的构造器了。super(...),它会隐式调用父类的无参构造(前提是父类有),所以整个构造链最终是合法的。每个构造方法都得确定最终调用哪个父类构造器:要么显式写 super(...),要么隐式调用 super()(无参父构)。而 this(...) 的本质就是把“谁去调用父构造”这件事转交给被委托的构造器。所以只要保证整条构造链的终点能正确调用 super(...)(显式或隐式),继承的要求就满足了。
举个例子:假设 A 类继承了 Object,它的双参构造里没写 super(),但因为 Object 有无参构造,所以隐式生效。而它的单参构造写了 this(x, 0),也就间接完成了父类初始化。换句话说,this(...) 不会破坏继承规则,它只是让构造链更干净。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8