静态最终成员先于其他静态成员初始化。
非最终静态成员按出现顺序初始化
因此,在您的第一种情况下:
static Test t=new Test(); static int a=5;
构造函数在
a初始化之前首先被调用,因此
a=0被显示。
在第二种情况下,
static finala在之前初始化
t,因此
a=5在
Test创建的第一个实例时显示。如果
a不是静态的,则在执行构造函数之前对其进行初始化,因此再次
a=5显示。
关于您的问题中的编辑。
查看JLS的12.4.2节:
- 然后,初始化其最终值是 编译时常量表达式
的接口的最终类变量和字段(第8.3.2.1,第9.3.1,第13.4.9,第15.28节)。…
- 接下来,以文本顺序执行类的类变量初始化器和静态初始化器,或接口的字段初始化器,就好像它们是单个块一样。
您会看到,仅当final类变量(即static
final)的值是编译时常量表达式时,它们才在其余静态变量之前初始化。
5是一个常量表达式。
newTest()不是。因此即使它们都是静态的final也会
a被初始化
t。



