调用构造器初始化执行顺序:
- 第一步:静态初始化语句、静态初始化块 按顺序依次执行。
- 第二步:非静态初始化语句、非静态初始化块 按顺序依次执行。
- 第三步:执行构造器方法。
注意:要是在加载静态部分时,通过new调用构造器,将会先暂停加载后面的静态部分,而去执行实例化。
静态部分只有在类第一次加载的时候,才会执行。之后再加载将不再执行。
示例:
public class Test1 {
public static int k = 0;
public static Test1 t1 = new Test1("t1");
public static Test1 t2 = new Test1("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static{
print("静态块");
}
public Test1(String str){
System.out.print("Test1:");
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;++n;
}
public static int print(String str){
System.out.print("print:");
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
public static void main(String[] args) {
Test1 t = new Test1("init");
}
}
上例执行结果:
print:1:j i=0 n=0
print:2:构造块 i=1 n=1
Test1:3:t1 i=2 n=2
print:4:j i=3 n=3
print:5:构造块 i=4 n=4
Test1:6:t2 i=5 n=5
print:7:i i=6 n=6
print:8:静态块 i=7 n=99
print:9:j i=8 n=100
print:10:构造块 i=9 n=101
Test1:11:init i=10 n=102
示例分析:
1.在main函数中,创建一个Test1的对象,通过new Test1("init");
调用Test1(String str)构造器方法对该对象进行初始化。因为这是第一次加载Test1类,所以将会先加载静态部分。
2.开始加载静态部分,先是静态初始化语句,第一句静态初始化语句public static int k = 0;
此时静态变量k为0。
3.下一句静态初始化语句public static Test1 t1 = new Test1("t1");
由于该句又对Test1类进行实例化,此时就是上文中注意部分所提到的,在加载静态部分时又创建一个对象,所以此时将不会接着向下加载静态部分,而是进行第二次实例化。此次实例化将不再加载静态部分,而是直接按顺序去执行非静态部分。
4.执行第一句非静态初始化语句 public int j = print("j");
,此时执行静态print方法,并传入参数 “j”,将打印出print:1:j i=0 n=0,因为执行++k
所以k值为1,由于 i 和 n 未被初始化赋值,只是声明,所以此时 i 和 n 将被赋以默认值0。在打印后,通过++n; return ++i;
分别将 n 和 i 加一,此时静态变量 i为1,n为1。
5.继续往下执行非静态部分,{print("构造块"); }
,再次执行print方法,并传入参数 “构造块”,将打印print:2:构造块 i=1 n=1,之后,静态变量n 和 i 分别加一,i为2,n为2。
6.接下来,继续向下执行非静态部分,发现后面没有非静态部分,最后将执行构造器方法Test1(String str)
,打印出Test1:3:t1 i=2 n=2,调用该构造器方法的语句 public static Test1 t1 = new Test1("t1");
传入参数“t1”,之后++i;++n;
又分别将 i 和 n 加一,i为3,n为3。此时这一次实例化完成。
7.接着继续向下执行静态语句public static Test1 t2 = new Test1("t2");
此时将又一次进行实例化,再一次执行Test1类中的非静态部分和构造器,将依次打印print:4:j i=3 n=3,print:5:构造块 i=4 n=4,Test1:6:t2 i=5 n=5,此时i为6,n为6,分析过程见4,5,6。
8.接着继续向下执行静态语句public static int i = print("i");
,执行print方法,传入参数“i”,将打印print:7:i i=6 n=6,之后 ++n; return ++i;
分别将 i 和 n又加一,此时i为7,n为7。
9.继续向下执行静态语句public static int n = 99;
,将静态变量 n 赋值为99。
10.继续向下执行静态部分,static{ print("静态块");}
静态初始化块,将执行print方法,打印print:8:静态块 i=7 n=99,此时i为8,n为100。
11.继续向下执行,此时还是在main方法中通过Test1 t = new Test1("init");
实例化的过程,静态部分执行完,将执行非静态部分,public int j = print("j");
,执行print方法,传入参数“j”,打印print:9:j i=8 n=100,此时i为9,n为101。
12.继续向下执行非静态部分{print("构造块");}
,打印print:10:构造块 i=9 n=101,此时i为10,n为102。
13.在静态部分、非静态部分执行后,最后执行构造器方法Test1(String str)
,调用该构造器的语句Test1 t = new Test1("init");
传入参数“init”,打印Test1:11:init i=10 n=102,此时i为11,n为103。
14.在以上过程中,每打印一次,由于++k
,静态变量k先加一。