目录
- 1. 说明
- 2. 类加载
- 3. 对象创建
- 4. 返回对象引用
1. 说明
- 1.在Java中,使用new关键字创建对象的过程是一个复杂而精细的过程,它涉及多个步骤,包括类加载、内存分配、初始化等。
2. 类加载
- 1.加载:Java虚拟机(JVM)通过类加载器将类的字节码文件加载到内存中。类加载器会根据类的全限定名查找对应的字节码文件,并将其转换为一个Class对象。这个Class对象包含了类的结构信息,如类的成员变量、方法、构造函数等。
- 2.验证:JVM验证加载的字节码文件是否符合Java虚拟机规范,以确保其安全性和正确性。
- 3.准备:为类的静态变量(无final修饰)和常量(final修饰)赋默认初始值。静态变量被初始化为默认值(如int为0,boolean为false),而常量则直接赋予其初始值。
- 4.解析:将类文件中的符号引用替换为直接引用,如类、方法的信息、文本字符串等。
- 5.初始化:通过类的构造器进行初始化,包括执行静态代码块和给静态变量赋予正确的值。
3. 对象创建
- 1.内存分配:在堆内存中为对象分配一块连续的内存空间。这块空间用于存储对象的实例变量和相关信息。内存分配策略可能包括指针碰撞和空闲列表两种方式,具体取决于堆内存的规整程度。
- 2.指针碰撞:如果堆内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器。所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。
- 3.空闲列表:如果堆内存中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,JVM就必须维护一个列表,记录上哪些内存块是可用的。在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。
- 4.属性初始化:将对象的内存空间初始化为默认的零值。基本类型的实例变量会被初始化为对应类型的零值(例如,整型为0,布尔型为false),而引用类型的实例变量会被初始化为null。
- 5.显示初始化:根据对象的类调用对应的构造函数,对对象进行初始化。构造函数会根据定义的参数列表执行一系列操作,例如初始化实例变量、执行其他方法等。这一步是对象定制化的过程,使得每个对象都有其独特的属性和状态。
4. 返回对象引用
- 1.构造函数执行完毕后,JVM将对象的引用返回给使用new关键字创建对象的代码。
- 2.后续的代码就可以通过该引用访问对象的实例变量和方法了。