在Java里,使用new关键字创建一个对象看似只是一行代码,实际上背后经历了类加载检查、内存分配、初始化和构造方法调用等多个阶段。理解这些过程,能帮助我们写出更稳妥的程序。

new 对象的完整流程
当我们写下类似 Person p = new Person(); 的语句时,虚拟机主要做了下面几件事。
1. 类加载检查
虚拟机先检查 Person 类是否已经被加载、连接和初始化。如果没有,就会先执行类加载过程。
2. 分配内存
在堆内存中划分一块空间给新对象。分配方式通常有两种:指针碰撞和空闲列表,取决于堆是否规整。
3. 设置默认值和对象头
分配到的内存会被清零,所有实例变量设为零值,如 int 为 0、引用为 null。同时对象头里会记录类元信息、哈希码等。
4. 执行构造方法
最后调用 <init> 方法,也就是我们写的构造器,给属性赋真正初始值。
代码示例
下面用一个简单类来看对象创建时的输出顺序。
public class Person {
// 实例变量
private String name = "默认名";
// 静态代码块
static {
System.out.println("类被加载了");
}
// 构造方法
public Person() {
System.out.println("构造方法执行,name=" + name);
}
public static void main(String[] args) {
// 使用 new 创建对象
Person p = new Person();
}
}
运行后会先打印类加载信息,再打印构造方法里的语句,说明 new 时类已就绪且构造器在最后发挥作用。
常见误区
- 认为 new 只调用了构造方法,其实前面还有内存分配和默认值设置。
- 在构造方法里过早使用未完成初始化的资源,可能导致空指针。
- 忽略类加载过程,多次 new 不会重复加载类,只会产生不同实例。
小结
Java 的 new 操作是类加载、内存分配、零值初始化和构造执行的组合。掌握它,能让你在面对对象生命周期和内存问题时更加从容。