java中this()只能调用本类已显式声明的无参构造器,且必须是首句;若未定义则编译报错;不可与super()共存,且需避免循环调用,最终须抵达不调用this()的终点构造器。

Java 中构造器里不能直接用 this() 调用“默认构造方法”,因为默认构造方法是编译器自动生成的、无参且仅在类中没有定义任何构造器时才存在;一旦你显式定义了任意构造器(哪怕是有参的),编译器就不再生成默认构造方法。所以,this() 只能调用本类中**已明确声明的、无参的构造器**,而不是“默认”的。
必须先显式定义一个无参构造器
如果你想在其他构造器中通过 this() 委托初始化逻辑,就得自己写一个无参构造器:
- 这个无参构造器可以是空的,也可以包含公共初始化代码(如字段赋值、资源准备等)
- 它必须是 public / protected / package-private(根据使用场景决定访问级别)
- 只要它存在,
this()就能调用它;否则编译报错:“cannot find symbol: method this()”
this() 必须是构造器中的第一条语句
Java 规定:如果使用 this(...) 或 super(...),它必须是构造器的第一行代码:
- 不能在 if 分支里、不能在 try 块里、不能在普通语句之后
- 错误示例:
int x = 1; this();→ 编译失败 - 正确示例:
public Person(String name) { this(); this.name = name; }
避免循环调用
多个构造器之间用 this() 链式调用时,必须确保最终能抵达一个不调用 this() 的构造器(即“终点构造器”),否则编译报错:
- 比如 A 调用 B,B 又调用 A → 编译器检测到循环,拒绝编译
- 推荐做法:让所有构造器最终都委托给一个最全参数的构造器(如全参构造器),由它完成实际初始化
和 super() 不能共存
一个构造器里只能有 this(...) 或 super(...) 中的一个,且必须是首句:
-
this()表示调用本类其他构造器,隐含已处理父类初始化(被调用的构造器里已有 super) - 不能同时写
super()和this(),也不能在一个构造器里既没写 super 也没写 this(此时编译器自动插入super())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











