Java类的初始化顺序

类初始化顺序遵循以下三个原则(优先级依次递减)
        1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;

        2、父类优先于子类初始化;

        3、成员变量按照定义先后顺序进行初始化;

例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等。

他们的初始化顺序是:父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类非静态变量 > 父类非静态代码块 > 父类构造函数 > 子类非静态变量 > 子类非静态代码块 > 子类构造函数。
 

1.对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是?

public class Test1 {
	// 静态变量
	public static String staticField = "静态变量";
	// 变量
	public String field = "变量";
	// 静态初始化块
	static {
	  System.out.println(staticField);
	  System.out.println("静态初始化块");
	}
	// 初始化块
	{
	  System.out.println(field);
	  System.out.println("初始化块");
	}
	// 构造器
	public Test1() {
	 System.out.println("构造器");
	}
	public static void main(String[] args) {
	 new Test1();
	}
}

执行结果如下:

Java类的初始化顺序_第1张图片

2.在继承场景下,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺是?

class Parent { 
	 // 静态变量
	 public static String p_StaticField = "父类--静态变量";
	 // 变量
	 public 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 Test2 extends Parent {
	 // 静态变量
	 public static String s_StaticField = "子类--静态变量";
	 // 变量
	 public String s_Field = "子类--变量";
	 // 静态初始化块
	 static {
	   System.out.println(s_StaticField);
	   System.out.println("子类--静态初始化块");
	 }
	 // 初始化块
	 {
	   System.out.println(s_Field);
	   System.out.println("子类--初始化块");
	 }
	 // 构造器
	 public Test2() {
	   System.out.println("子类--构造器");
	 }
	 // 程序入口
	 public static void main(String[] args) {
	   new Test2();
	 }
}

 执行结果如下:

Java类的初始化顺序_第2张图片

3.静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢? 

public class Test3 {
// 静态变量
public static TestA a = new TestA();
// 静态初始化块
static {
   System.out.println("静态初始化块");
}
// 静态变量
public static TestB b = new TestB();
	public static void main(String[] args) {
		new Test3();
	}
}
class TestA {
	public TestA() {
		System.out.println("Test--A");
	}
}
class TestB {
	public TestB() {
		System.out.println("Test--B");
	}
}

执行结果如下:

你可能感兴趣的:(Java,java,开发语言)