Java类中包含如下几类部分:
1.静态变量——用static修饰的变量
2.静态初始化块——static{}圈起来的初始化块
3.静态方法——用static修饰的方法
4.变量
5.初始化块
6.构造器
7.普通方法
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是(静态变量、静态初始化块)>(变量、初始化块)>构造器
public class Test1 {
public static String var1 = getStaticField();
public String var2 = getField();
static {
System.out.println("Test1 静态初始化块 初始化");
}
{
System.out.println("Test1 初始化块 初始化");
}
public Test1() {
System.out.println("Test1 构造函数 初始化");
}
public static String getStaticField() {
String statiFiled = "Static Field Initial";
System.out.println("Test1 静态变量 初始化");
return statiFiled;
}
public static String getField() {
String filed = "Field Initial";
System.out.println("Test1 普通变量 初始化");
return filed;
}
public static void main(String[] args) {
Test1 test1 = new Test1();
}
}
运行该程序,可以看到执行结果如下:
Test1 静态变量 初始化
Test1 静态初始化块 初始化
Test1 普通变量 初始化
Test1 初始化块 初始化
Test1 构造函数 初始化
那静态变量和静态初始化块孰先孰后呢?这跟代码的书写顺序有关,静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
那么在继承关系下的情况又是如何呢?我们也用一段代码来测试一下。编写一个Test2类继承Test1:
public class Test2 extends Test1 {
public static String var1 = getStaticField();
public String var2 = getField();
static {
System.out.println("Test2 静态初始化块 初始化");
}
{
System.out.println("Test2 初始化块 初始化");
}
public Test2() {
System.out.println("Test2 构造函数 初始化");
}
public static String getStaticField() {
String statiFiled = "Static Field Initial";
System.out.println("Test2 静态变量 初始化");
return statiFiled;
}
public static String getField() {
String filed = "Field Initial";
System.out.println("Test2 普通变量 初始化");
return filed;
}
public static void main(String[] args) {
Test2 Test2 = new Test2();
}
}
执行Test2中的main方法,可以看到控制台输出结果如下:
Test1 静态初始化块 初始化
Test1 静态变量 初始化
Test2 静态变量 初始化
Test2 静态初始化块 初始化
Test1 普通变量 初始化
Test1 初始化块 初始化
Test1 构造函数 初始化
Test2 普通变量 初始化
Test2 初始化块 初始化
Test2 构造函数 初始化
由此可以得出结论:
父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器