我们来看如下的代码:

/**
 * @program: shiro_code
 * @description: 对象的生命周期
 * @author: YangHang
 * @create: 2019-07-01 22:21
 **/

public class ObjectLifeCycle {
    public static void main(String[] args) {
        Person p = new Person();
        p.speak();
    }

}

class Person {

    // 姓名
    private String name;
    // 年龄
    private int age = 20;

    public Person() {
        name = "YangHang";
        age = 12;
    }

    public void speak() {
        System.out.println(name + "   " + age);
    }
}

你知道最后的打印结果是多少么, 我们运行来看一下。
Java中创建对象的过程_初始化
这就说明构造函数的调用肯定在显式初始化之后。
那么这个案例的执行流程是什么样子的呢?

/**
     * 本类执行流程为:
     * 1.ObjectLifeCycle.class加载进方法区
     * 2.main方法压栈
     * 3.Person.class加载进方法区
     * 4.在main方法的栈帧中声名Person p的引用
     * 5.在堆内存中开辟Person对象的内存空间,并指向栈中的引用
     * 6.对Person的成员变量进行隐式初始化
     * 7.对Person的成员变量进行显式初始化
     * 8.构造方法压栈,为成员变量赋值
     * 9.构造方法出栈
     * 10.speak方法压栈
     * 11.speak方法出栈
     * 12.main方法出栈
     */

我们画图来说明一下。
Java中创建对象的过程_初始化_02