Java构造方法无返回类型声明,名称须与类名完全一致;可重载,若自定义则默认无参构造消失;this()和super()调用均须首行且互斥;另有反射、反序列化等绕过构造的创建方式。
构造方法没有返回值类型声明
Java构造方法的名字必须和类名完全一致,且不能写void、int等任何返回类型——连void都不行。写了就变成普通方法,JVM不会在new时调用它。
常见错误:手抖加了void,编译不报错但对象初始化逻辑没执行,后续出现NullPointerException或字段为默认值(如0、null)才意识到问题。
- 构造方法可以重载,只要参数列表不同即可
- 如果没写任何构造方法,编译器会自动补一个无参的默认构造方法
- 一旦写了至少一个构造方法,编译器就不再生成默认构造方法——子类
extends时若没显式调用父类构造,会直接编译失败
构造方法里调用this(...)必须是第一行
同一个类中多个构造方法之间可以通过this(...)互相调用,但这条语句必须出现在第一行,否则编译报错:Constructor call must be the first statement in a constructor。
这个限制是为了确保对象状态在进入构造体之前,已由某个构造路径完成基础初始化(比如字段赋值、资源检查),避免字段处于“半初始化”状态。
立即学习“Java免费学习笔记(深入)”;
-
this(...)和super(...)不能共存于同一个构造方法中 - 不能在普通方法里调用
this(...),只允许在构造方法首行使用 - 递归调用
this(...)会导致编译失败(编译期检测)
父类构造方法通过super(...)显式或隐式调用
每个构造方法第一行,要么是this(...),要么是super(...)(可省略),二者必居其一。如果没写,编译器自动插入super()(无参调用)。如果父类没有无参构造方法,而子类又没显式写super(...),就会编译失败。