在new一个对象的时候,Java虚拟机做了什么?
1. 整体流程
当我们使用关键字new
创建一个对象时,Java虚拟机(JVM)会按照以下流程执行:
- 检查
new
关键字后面的类是否已经被加载到内存中,如果没有,则需要先执行类加载过程。 - 为对象分配内存空间。
- 初始化对象的成员变量,即给对象的成员变量赋初始值。
- 执行对象的构造方法,执行构造方法中的代码,并完成对象的初始化工作。
- 返回对象的引用。
下面我们逐步详细解释每一步的具体操作。
2. 具体步骤及代码
2.1 类加载
在第一步中,Java虚拟机会先检查对应的类是否已经被加载到内存中。如果没有加载,JVM会按照以下顺序执行类加载过程:
-
加载:通过类的全限定名找到对应的字节码文件,并将字节码文件加载到内存中。
Class<?> clazz = Class.forName("com.example.MyClass");
-
链接:将字节码文件中的符号引用替换为直接引用。
- 验证:检查字节码文件的正确性和安全性。
- 准备:为类的静态变量分配内存空间,并赋予默认值。
- 解析:将常量池中的符号引用替换为直接引用。
// 在准备阶段,分配内存空间,为静态变量赋初值 // int类型的静态变量默认值为0 private static int count; // 在解析阶段,将常量池中的符号引用替换为直接引用 // 在解析阶段,外部引用的类MyDependency会被加载并连接 private static MyDependency dependency;
-
初始化:执行类的初始化代码,包括静态变量赋值和静态代码块。
// 静态变量赋值 count = 0; // 静态代码块 static { dependency = new MyDependency(); }
2.2 对象内存分配
在第二步中,Java虚拟机会为对象分配内存空间。具体的内存分配方式有多种,其中最常见的方式是使用指针碰撞和空闲列表两种方式。
2.3 初始化成员变量
在第三步中,Java虚拟机会对对象的成员变量进行初始化。对象的成员变量根据其类型会被赋予默认值,例如int
类型的成员变量默认值是0,boolean
类型的成员变量默认值是false
。
2.4 执行构造方法
在第四步中,Java虚拟机会执行对象的构造方法,完成对象的初始化工作。构造方法是用于创建对象时执行的特殊方法,用于初始化对象的状态。
public class MyClass {
// 构造方法
public MyClass() {
// 构造方法中的代码
// ...
}
}
// 创建对象时会执行构造方法
MyClass myObject = new MyClass();
2.5 返回对象引用
在第五步中,Java虚拟机会返回对象的引用。我们可以通过这个引用来操作和访问对象的成员变量和方法。
// 返回对象引用,赋值给变量myObject
MyClass myObject = new MyClass();
// 通过对象引用调用对象的方法
myObject.doSomething();
3. 总结
上述就是在使用关键字new
创建一个对象时,Java虚拟机所做的工作流程。通过以上步骤,我们可以清楚地理解在创建一个对象的过程中,虚拟机所需要进行的操作。理解这个过程有助于我们更好地利用Java的面向对象特性进行编程。