java 对象的初始化过程研究与探索

时间:2022-02-22 21:49:38

准备工作:

在研究对象的初始化过程的之前,先建立一个类,如下所示。为了更清楚的认识类的初始化过程,我使用了初始化块来打印出相关的数据状态。

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对象。

转载自:Java对象的初始化过程研究与探索