一、new Object()
在Java中,创建一个对象方法之一是使用new关键字,如下为创建一个对象的案例:
class ObjectDemo {
public int id;
@Override
public String toString() {
return "id:" + id;
}
}
public class ObjectMain {
public static void main(String []args) {
// 使用new创建一个ObjectDemo对象
ObjectDemo objectDemo = new ObjectDemo();
System.out.println(objectDemo);
}
}
二、对象创建过程
当我们使用new关键字创建一个对象后,JVM的执行流程是什么样的呢?此处只讨论非静态变量(没有static修饰的关键字)。
图1 JVM执行过程
- 使用new创建一个对象时,JVM会先从常量池中检查是否有该类的引用,如果没有则需要先进行类加载操作,否则执行下一步;
- 存在该类的引用,根据该引用信息向堆中申请指定大小的内存(该内存在类加载后即被指定),并对非静态变量初始化(对于普通类型设置为0(如int),引用类型设置为null)
- 设置非静态变量的值
- 调用构造函数
三、变量值的变化状态
class ObjectDemo {
// 非静态变量
int num = 123;
// 构造代码块
{
System.out.println("构造代码块->num: " + num);
}
// 构造函数
public ObjectDemo(int num) {
System.out.println("执行构造函数");
}
}
// 主测试类
public class ObjectMain {
// main方法
public static void main(String []args) {
// 查看代码块和构造函数的执行顺序,查看非静态变量设置值的时间
ObjectDemo objectDemo = new ObjectDemo();
}
}
代码执行结果如下:
构造代码块->num: 123
执行构造函数
四、实验结果分析
从实验结果可以看出:
- 创建一个对象时,非静态代码块的执行顺序为:构造代码块->构造函数
- 非静态变量值设置的时间顺序为:先根据所设定的值进行设置(程序中:int num = 123),然后根据构造函数所给的值进行设置