我们来看如下的代码:
/**
* @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);
}
}
你知道最后的打印结果是多少么, 我们运行来看一下。
这就说明构造函数的调用肯定在显式初始化之后。
那么这个案例的执行流程是什么样子的呢?
/**
* 本类执行流程为:
* 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方法出栈
*/
我们画图来说明一下。