调用构造器的顺序步骤:
1、所有数据域被初始化为默认值(0、false或null)。
2、按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4、执行这个构造器主体。
示例:
public class Test1 {
public static int k =10;
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");
}
}
这个示例中,先从上往下执行,运行到"public static Test1 t1 = new Test1(“t1”);"语句时,先向下运行非静态语句“public int j = print(“j”);”,该语句调用到了print方法,向下执行语句
public static int print(String str){
System.out.print("print:");
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
执行完毕后,结果为:print:11:j i=0 n=0
。
此时i变成了1,回复i的值,然后继续向下执行print(“构造块”)方法,结果为:print:12:构造块 i=1 n=1
。
结束后非静态语句运行完成。然后运行new构造器方法(new Test1(“t2”)):
public Test1(String str){
System.out.print("Test1:");
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;++n;
}
结果为:Test1:13:t1 i=2 n=2
继续循环静态语句,同理,结果为:
print:14:j i=3 n=3
print:15:构造块 i=4 n=4
Test1:16:t2 i=5 n=5
继续循环静态语句,调用print方法,向下执行语句
public static int print(String str){
System.out.print("print:");
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
结果为:
print:17:i i=6 n=6
然后继续向下,public static int n = 99;
,此时n的值变成了99。继续向下执行静态语句print("静态块")
。
然后按顺序向下执行:
public int j = print("j");
{
print("构造块");
}```
最后执行main方法:
```java
public static void main(String[] args) {
Test1 t = new Test1("init");
}
最后的执行结果为:
print:11:j i=0 n=0
print:12:构造块 i=1 n=1
Test1:13:t1 i=2 n=2
print:14:j i=3 n=3
print:15:构造块 i=4 n=4
Test1:16:t2 i=5 n=5
print:17:i i=6 n=6
print:18:静态块 i=7 n=99
print:19:j i=8 n=100
print:20:构造块 i=9 n=101
Test1:21:init i=10 n=102
注意:执行过程中遇到new语句,直接按顺序向下执行非静态语句,然后再执行new方法,最后再向下执行。
首先是类加载到虚拟机的准备阶段进行初始化,所有数据域被初始化为默认值(0、false或null)。然后依次执行所有的非静态方法,最后执行静态方法。