准备工作:
在研究对象的初始化过程的之前,先建立一个类,如下所示。为了更清楚的认识类的初始化过程,我使用了初始化块来打印出相关的数据状态。
class Person {
private static Person person= new Person();
public static int count1;
public static int count2 = 5;
public int count3;
static
{
System.out.println("[静态初始化块]count2="+count2);
System.out.println("[静态初始化块]person="+person);
}
private Person() {
count1++;
count2++;
System.out.println("[执行Person构造函数]count1="+count1);
System.out.println("[执行Person构造函数]count2="+count2);
}
public static Person getInstance()
{
return person;
}
{
System.out.println("[初始化块]count3="+count3);
System.out.println("[初始化块]person="+person);
}
public Person(int count)
{
this.count3=count;
System.out.println("[构造函数初始化]count3="+count3);
}
}
测试类的设计:
public class Test
{
public static void main(String[] args)
{
System.out.println("[新建变量]person");
Person person;
System.out.println("[执行构造函数导致变量初始化]");
person= new Person(10);
System.out.println("[执行类的静态函数]");
Person.getInstance();
}
}
运行结果:
[新建变量]person
[执行构造函数导致变量初始化]
[初始化块]count3=0
[初始化块]person=null
[执行Person构造函数]count1=1
[执行Person构造函数]count2=1
[静态初始化块]count2=5
[静态初始化块]person=Person@757aef
[初始化块]count3=0
[初始化块]person=Person@757aef
[构造函数初始化]count3=10
[执行类的静态函数]
结果分析:
(1)Person person;此句话表明jvm建立一个变量,类型为Person,此时Person还没有加载。
(2)person= new Person(10);此句话表明jvm先加载Person类,并进行初始化。Person类的初始化顺序为:
第一步:初始化静态变量person。此处通过Person的构造函数来初始化,所以又分为两步:执行初始化块和执行构造函数。
第二步:执行静态初始化块。
Person类初始化之后,开始构造person对象,执行的的顺序为:执行初始化块和执行构造函数。总之,概况的说:person= new Person(10);的底层实现是先加载并初始化Person的静态变量,然后初始化Person对象。