逛逛论坛,看到里面讨论Java类变量初始化顺序问题,然后自己也想了一下,发现与讨论有点出入,怀疑记忆出了问题,然后马上上机验证,得出一下结论:
Java类变量初始化顺序为:父类静态成员初始化——>父类静态块初始化——>子类静态成员初始化——>子类静态块初始化——>父类成员变量初始化——>父类代码块初始化——>父类构造方法——>子类成员变量初始化——>子类代码块初始化——>子类构造方法。
1、测试类:Test
public class Test {
public Test(String string) {
System.out.println(string);
}
}
2、Father类:
public class Father {
static Test father = new Test("父类静态成员初始化");
Test father2 = new Test("父类成员变量初始化");
static {
System.out.println("父类静态块初始化");
}
{
System.out.println("父类代码块代码块");
}
public Father() {
System.out.println("父类构造方法");
}
public Father(String string) {
System.out.println(string);
}
}
public class Son extends Father {
static Test son = new Test("子类静态成员初始化");
Test son2 = new Test("子类成员变量初始化");
static {
System.out.println("子类静态块初始化");
}
{
System.out.println("子类代码块代码块");
}
public Son() {
System.out.println("子类构造方法");
}
public Son(String string) {
System.out.println(string);
}
}
4、场景类
public class TestMain {
public static void main(String[] args) {
new Son();
}
}
很显然上面说的运行结果是正确的。