一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java 构造方法中通过 this 调用构造器有什么规则

时间:2026-07-02 10:34:57 编辑:袖梨 来源:一聚教程网

Java中this()调用本类构造器必须首行、唯一、不与super()共存,参数须严格匹配目标构造器签名,调用链须终止于无this()的构造器,推荐以全参构造器为统一入口。

Java 中在构造方法里用 this() 调用本类其他构造器,不是随便写的,它有一套硬性规则,违反任何一条都会编译失败。

必须是构造器的第一条可执行语句

哪怕前面只加一个变量声明、一行日志或一个空行,都会报错:“call to this must be first statement”。这不是建议,是编译器强制要求。

  • ✅ 正确:this("张三", 25);(单独一行,开头)
  • ❌ 错误:String tmp = "test"; this("张三", 25);(有前置语句)
  • ❌ 错误:if (true) { this("张三"); }(不能放在控制结构里)

只能调用一次,且不能和 super() 共存

一个构造器里最多出现一个 this(),也不能同时写 super()——二者都争抢首行位置,语法上互斥。

  • ✅ 合法链路:无参构造 → this("默认名")this("默认名", 0) → 最终某个构造器显式或隐式调用 super()
  • ❌ 编译失败:this("a"); super();this(); this(123);

实参必须严格匹配目标构造器签名

传给 this() 的参数,类型、数量、顺序必须和本类中某个构造器完全一致。Java 不做隐式转换,比如 String 不会自动转成 int,int 也不会自动装箱成 Integer。

立即学习“Java免费学习笔记(深入)”;

  • ✅ 匹配:this(10) 调用 public Person(int age)
  • ✅ 允许自动提升:this(5) 调用 Person(long id)(int → long)
  • ❌ 不匹配:this("10") 尝试调用 Person(int age)
  • ❌ 不匹配:this("Alice", 5, true) 但类中只有 Person(String, int)

调用链必须终止,不能循环

所有 this() 调用最终必须落到一个不调用 this() 的构造器上,否则就是死循环。编译器可能不立即报错,但运行时会 StackOverflow。

  • 推荐做法:设一个“主构造器”(通常参数最全),其他构造器都单向委托给它
  • 避免模式:A()this("x")B(String)this() → 又回到 A()
  • 复杂初始化(如查数据库、解析 JSON)别塞进构造器,应移到独立方法或工厂里

热门栏目