0
点赞
收藏
分享

微信扫一扫

在new一个对象的时候,Java虚拟机做了什么?

zidea 2023-07-19 阅读 71

在new一个对象的时候,Java虚拟机做了什么?

1. 整体流程

当我们使用关键字new创建一个对象时,Java虚拟机(JVM)会按照以下流程执行:

  1. 检查new关键字后面的类是否已经被加载到内存中,如果没有,则需要先执行类加载过程。
  2. 为对象分配内存空间。
  3. 初始化对象的成员变量,即给对象的成员变量赋初始值。
  4. 执行对象的构造方法,执行构造方法中的代码,并完成对象的初始化工作。
  5. 返回对象的引用。

下面我们逐步详细解释每一步的具体操作。

2. 具体步骤及代码

2.1 类加载

在第一步中,Java虚拟机会先检查对应的类是否已经被加载到内存中。如果没有加载,JVM会按照以下顺序执行类加载过程:

  1. 加载:通过类的全限定名找到对应的字节码文件,并将字节码文件加载到内存中。

    Class<?> clazz = Class.forName("com.example.MyClass");
    
  2. 链接:将字节码文件中的符号引用替换为直接引用。

    • 验证:检查字节码文件的正确性和安全性。
    • 准备:为类的静态变量分配内存空间,并赋予默认值。
    • 解析:将常量池中的符号引用替换为直接引用。
    // 在准备阶段,分配内存空间,为静态变量赋初值
    // int类型的静态变量默认值为0
    private static int count;
    
    // 在解析阶段,将常量池中的符号引用替换为直接引用
    // 在解析阶段,外部引用的类MyDependency会被加载并连接
    private static MyDependency dependency;
    
  3. 初始化:执行类的初始化代码,包括静态变量赋值和静态代码块。

    // 静态变量赋值
    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的面向对象特性进行编程。

举报

相关推荐

0 条评论