最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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)别塞进构造器,应移到独立方法或工厂里
相关文章
- 望月角色好感度怎么提升 好感度提升方法攻略 07-06
- crewAIInc/crewAI skill 本地安装使用教程(新手) 07-06
- 《明日方舟终末地》骏卫怎样配队-骏卫强力阵容配队攻略 07-06
- 《明日方舟终末地》莱万汀怎么样-莱万汀值得抽吗 07-06
- ruvnet/ruflo skill 本地安装使用教程(新手) 07-06
- 《明日方舟终末地》怎样突破20级-激活精英化节点怎么做 07-06