知道java的初始化顺序为先执行父类的静态属性初始化(静态变量,静态初始化块,无先后顺序,按代码顺序执行初始化),然后执行子类的静态属性的初始化
之前做过如下面代码的笔试题:
public class Test {
static Test test = new Test();
static {
System.out.println("静态代码块");
}
{
System.out.println("非静态代码块");
}
public static void main(String[] args){
System.out.println("开始执行Main方法");
Test test = new Test();
}
}
结果为:
非静态代码块
静态代码块
开始执行Main方法
非静态代码块
先初始化static Test test = new Test()语句,因为是static修饰的Test类型的test对象,执行new Test(),调用Test类的构造方法,因为调用构造方法必须先执行一次初始化块语句,所以输出“非静态代码块”,然后执行static代码块,输出“静态代码块”,类初始化结束
执行方法,就先输出“执行main方法”,然后再次执行new Test(),调用Test类的构造方法,再次执行初始化块,输出“非静态代码块”,结束
下面代码是关于静态变量和静态初始化块的初始化顺序的测试:
public class Test2 {
static int b = 3;
static {
a =1;
b =1;
System.out.println("静态初始化块");
}
static int a = 2 ;
{
System.out.println("初始化块");
}
public static void main(String[] args) {
System.out.println(a + "---" + b);
new Test2();
}
}
结果:
静态初始化块
2---1
初始化块