1、对于静态变量、静态初始化块、变量、初始化块、构造器的初始化顺序
public class Test02 {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
{
System.out.println(field);
System.out.println("初始化块");
}
public Test02() {
System.out.println("构造器");
}
public static void main(String[] args) {
new Test02();
}
}
运行代码 结果如下:
由此可见:
(静态变量、静态初始化块)>(变量、初始化块) >(构造器)
2 、 继承关系下的初始化顺序
class parent {
public static String p_staticField = "父类 -静态变量";
public static String p_field = "父类 - 变量";
static {
System.out.println(p_staticField);
System.out.println("父类 -- 静态初始化块");
}
{
System.out.println(p_field);
System.out.println("父类 -- 初始化块");
}
public parent() {
System.out.println("父类--构造器");
}
}
public class child extends parent {
public static String c_staticField = "子类 -- 静态变量";
public static String c_field = "子类 -- 变量";
static {
System.out.println(c_staticField);
System.out.println("子类 -- 静态初始化块");
}
public child() {
System.out.println("子类 -- 构造器");
}
{
System.out.println(c_field);
System.out.println("子类 -- 初始化块");
}
public static void main(String[] args) {
new child();
}
}
运行代码如下:
由此可见:
(父类静态变量和父类静态初始化块) > (子类静态变量和子类静态初始化块) >(父类变量和初始化块)>(
父类的构造器)>(子类变量和初始化块)>(子类构造器)
3、静态变量和静态初始化、变量和初始化变量的初始化顺序
public class Test01 {
static {
System.out.println("静态初始化块");
}
public static TestA testA = new TestA();
public static TestB testB = new TestB();
public static void main(String[] args) {
new Test01();
}
}
class TestA{
public TestA() {
System.out.println("Test -- a");
}
}
class TestB{
public TestB() {
System.out.println("Test -- b");
}
}
运行结果如下:
改变初始化块和变量的顺序
public class Test01 {
public static TestA testA = new TestA();
public static TestB testB = new TestB();
static {
System.out.println("静态初始化");
}
public static void main(String[] args) {
new Test01();
}
}
class TestA{
public TestA() {
System.out.println("Test -- a");
}
}
class TestB{
public TestB() {
System.out.println("Test -- b");
}
}
运行结果如下:
由此可见:静态初始化块和静态变量的先后顺序是:他们在类中出现的先后顺序