首页 > 代码库 > java类的初始化顺序

java类的初始化顺序

方便查看初始化顺序,使用了下面的打印类

public class Print {
	
	public Print(String str){
		System.out.println(str);
	}

}

本文讨论两种情况下类的初始化顺序,分别是单独类的初始化,和有继承关系的类的初始化

1.单独类的初始化

以下面的代码为例

public class Father {
	
	static {
		System.out.println("Father 静态代码块");
	}
	
	public static Print fatherStaticPrint = new Print("Father 静态变量");
	
	public Print fatherPrint = new Print("Father 非静态变量");
	
	public Father(){
		System.out.println("Father 构造函数");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Father 析构函数");
	}
		
}

在main函数当中初始化

public static void main(String args[]){
		Father father = new Father();
		System.runFinalizersOnExit(true); 
}

执行的结果如下

技术分享

 

如果将Father类的静态代码块和静态变量位置变换一下,如下所示

public class Father {
	
	public static Print fatherStaticPrint = new Print("Father 静态变量");
	
	static {
		System.out.println("Father 静态代码块");
	}
	
	public Print fatherPrint = new Print("Father 非静态变量");
	
	public Father(){
		System.out.println("Father 构造函数");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Father 析构函数");
	}
		
}

那么执行的结果就变成

技术分享

因此可以得出结论:静态代码块和静态变量的优先级是一样的,谁排在前面就先初始化谁。

具体过程如下图所示:

技术分享

 

2.有继承关系的类的初始化

以下面的类为例

public class Son extends Father {
	
	static {
		System.out.println("Son 静态代码块");
	}
	
	public static Print SonStaticPrint = new Print("Son 静态变量");
	
	public Print SonPrint = new Print("Son 非静态变量");
	
	public Son(){
		System.out.println("Son 构造函数");
	}	
	
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Son 析构函数");
	}

}

类Son继承类Father,在Main函数当中初始化Son,执行结果如下

技术分享

因此可以得出如下结论:

技术分享

java类的初始化顺序