关于种初始化顺序

关于类初始化顺序
昨天看了篇论坛的文章,谈的是继承类的初始化顺序,因为以前没有接触过,所以,回去写了一遍,也算是让作为菜鸟的我加深下印象和理解吧。

一、首先谈的是类的初始化顺序:
类的初始化顺序对于静态变量、静态初始化块、变量、初始化块、构造器,
它们的初始化顺序以此是
(静态变量、静态初始化块)>(变量、初始化块)>构造器

下面是示例代码
/**
 * 类的初始化顺序
 * 对于静态变量、静态初始化块、变量、初始化块、构造器,
 * 它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器
 * @author ☞alading
 *
 */
public class InitialOrderTest {
	//静态变量
	public static String staticField = "静态变量";
	
	//变量
	public String field = "变量";
	
	//静态初始化块
	static{
		System.out.println(staticField);
		System.out.println("静态初始化块");
	}
	
	//初始化块
	{
		System.out.println(field);
		System.out.println("初始化块");
	}
	
	//构造器
	public InitialOrderTest(){
		System.out.println("构造器");
	}

	public static void main(String[] args) {
		new InitialOrderTest();
	}

}
/*
运行结果:

静态变量
静态初始化块
变量
初始化块
构造器
*/


二、如果是继承类,子类的初始化并不是完全都在父类初始化后再进行,子类的静态变量和静态初始化块是在父类前完成初始化的。

示例代码
/**
 * 子类的初始化并不是完全都在父类初始化后再进行,子类的静态变量和静态初始化块是在父类前完成初始化的
 * @author ☞alading
 *
 */
public class SubClass extends Parent {
	
	//静态变量
	public static String s_StatisField = "子类--静态变量";
	
	//变量
	public String s_Field = "子类--变量";
	
	//静态初始化块
	static{
		System.out.println(s_StatisField);
		System.out.println("子类--静态初始化块");
	}
	
	//初始化块
	{
		System.out.println(s_Field);
		System.out.println("子类--初始化块");
	}
	
	//构造器
	public SubClass(){
		System.out.println("子类--构造器");
	}
	
	//程序入口
	public static void main(String[] args) {
		new SubClass();
	}
	
}

/*
 * 父类
 */
class Parent{
	
	//静态变量
	public static String p_StatisField = "父类--静态变量";
	
	//变量
	public String p_Field = "父类--变量";
	
	//静态初始化块
	static{
		System.out.println(p_StatisField);
		System.out.println("父类--静态初始化块");
	}
	
	//初始化块
	{
		System.out.println(p_Field);
		System.out.println("父类--初始化块");
	}
	
	//构造器
	public Parent(){
		System.out.println("父类--构造器");
	}
	
}
/*
 * 运行结果
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
 */


三、静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化,类似的变量和初始化块也是按照出现的先后顺序进行初始化的。
注意的是,构造器是在这几个当中最后初始化的,不管它出现的位置

示例代码
/**
 * 静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化
 * @author ☞alading
 *
 */
public class TestOrder {
	//静态变量
	public static TestA a = new TestA();
	
	//静态初始化块
	static{
		System.out.println("静态初始化块");
	}
	
	//静态变量
	public static TestB b = new TestB();
	
	public static void main(String[] args) {
		new TestOrder();
	}

}

class TestA{
	public TestA(){
		System.out.println("Test--A");
	}
}
class TestB{
	public TestB(){
		System.out.println("Test--B");
	}
}
/*
Test--A
静态初始化块
Test--B
*/