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(...),就会编译失败。
典型场景:父类只提供了带参构造(比如Person(String name)),子类构造方法里忘了写super(name),就会卡在编译阶段。
-
super(...)也必须是第一行 - 不能在静态上下文(如
static块或static方法)中调用super - 多层继承时,构造调用链从子类到父类再到
Object,逐级向上
构造方法不是初始化对象的唯一方式
除了new Xxx()触发构造方法外,Java还有几种绕过构造方法的对象创建路径,它们不执行任何构造逻辑:
- 反射调用
Constructor.newInstance():正常走构造方法 - 反射调用
Unsafe.allocateInstance():不调用构造方法,字段全为默认值 - 反序列化(
ObjectInputStream.readObject()):跳过所有构造方法,直接分配内存并还原字段值 - 克隆(
clone()):复制已有对象,不调用构造方法
这意味着,依赖构造方法做关键校验(比如参数非空检查)的类,在反序列化或Unsafe场景下可能被绕过,字段处于非法状态——需要配合readObject自定义逻辑或serialPersistentFields防御。
真正安全的初始化,往往得结合构造方法 + final字段 + 不可变设计,再辅以反序列化钩子。单靠构造方法拦不住所有入口。





